Имеет ли смысл анализировать логический результат присваивания переменной?

Я только что читал код и обнаружил очень странную строку кода, написанную другим программистом:

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, но затем я нашел другое место в коде, где возникает такая же ситуация, поэтому я не могу предположить, что это единичная ошибка.

Я хотел бы знать, если моя интерпретация верна.

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 также получает это.

6

Другие решения

В C и C ++ встроенный оператор присваивания возвращает свой левый операнд после присваивания. Итак, линия

if ((socket_obj->client_fd = accept(...)) < 0)

делает следующее:

  1. Вызовы accept()
  2. Назначает свой результат socket_obj->client_fd,
  3. Сравнивает socket_obj->client_fd с 0,
5