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

0

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

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

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

  • 2
    Нет. Вы должны прочитать о назначении оператора. Или попробуйте свой пример и посмотрите, что произойдет.
  • 1
    Кстати, вы имели в виду if (myVariable == 0) вместо if (myVariable = 0) ? (myVariable = 0) всегда ложно.
Показать ещё 2 комментария
Теги:
boolean-operations
assign

2 ответа

6
Лучший ответ

Назначение не возвращает 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 также получает его.

  • 0
    @ haccks Что? Вопрос в том I mean, won't the following line always return true? , Прочти снова.
  • 0
    @ время хака кофе;)
Показать ещё 2 комментария
5

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

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

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

  1. Вызовы accept()
  2. Присваивает свой результат socket_obj->client_fd.
  3. Сравнивает socket_obj->client_fd с 0.
  • 0
    спасибо за ответ, Савин! Теперь я понимаю, где была моя ошибка.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню