Я читал код только сейчас, и я нашел очень странную строку кода, написанную другим программистом:
if ((socket_obj->client_fd = accept(socket_obj->server_fd, (struct sockaddr *)&socket_obj->client_address, &fromlen)) < 0)
Если я правильно понял, строка вызывает функцию socket.h
accept
которая возвращает целочисленное значение. По завершении функции это значение присваивается socket_obj->client_fd
а затем операция присваивания вычисляется, если она меньше 0.
Но не всегда ли это было бы выше 0, поскольку логический результат присвоения значений всегда истинен? Я имею в виду, не будет ли следующая строка всегда возвращать true?
if (myVariable = 0)
Сначала я подумал, что это socket_obj->client_fd
кодирования и изменил код, поэтому сначала происходит назначение, а затем значение внутри socket_obj->client_fd
оценивается с 0, но затем я нашел другое место в коде, где происходит такая же ситуация, поэтому я могу Я предполагаю, что это изолированная ошибка.
Тогда я хотел бы знать, если моя интерпретация верна.
Назначение не возвращает true
. Попробуй сам. Назначение возвращает значение, которое было назначено.
int main() {
int a;
std::cout << ( (a = 0) ? "true" : "false" ) << '\n';
return 0;
}
Обратите внимание, что результирующее значение не должно быть true
или false
. Например, что вы можете сделать:
int x, y;
x = y = 4; // both x and y are 4 now
Это эквивалентно:
x = ( y = 4 );
И так как y
присваивание возвращает значение, присвоенное y
, которое равно 4
, x
также получает его.
I mean, won't the following line always return true?
, Прочти снова.
В C и C++ встроенный оператор присваивания возвращает свой левый операнд после назначения. Таким образом, линия
if ((socket_obj->client_fd = accept(...)) < 0)
делает следующее:
accept()
socket_obj->client_fd
.socket_obj->client_fd
с 0
.
if (myVariable == 0)
вместоif (myVariable = 0)
?(myVariable = 0)
всегда ложно.