Я только что читал код и обнаружил очень странную строку кода, написанную другим программистом:
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? Я имею в виду, не будет ли следующая строка всегда возвращать true?
if (myVariable = 0)
Сначала я подумал, что это было ошибочное кодирование, и изменил код, так что сначала происходит присвоение, а затем значение внутри 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
также получает это.
В C и C ++ встроенный оператор присваивания возвращает свой левый операнд после присваивания. Итак, линия
if ((socket_obj->client_fd = accept(...)) < 0)
делает следующее:
accept()
socket_obj->client_fd
,socket_obj->client_fd
с 0
,