Я писал код на C ++ и по ошибке пропустил имя функции WSASocket
. Однако мой компилятор не выдал ошибку и связал my SOCKET
с целочисленным значением 1 вместо действительного сокета.
Рассматриваемый код должен был выглядеть так:
this->listener = WSASocket(address->ai_family, address->ai_socktype, address->ai_protocol, NULL, NULL, WSA_FLAG_OVERLAPPED);
Но вместо этого это выглядело так:
this->listener = (address->ai_family, address->ai_socktype, address->ai_protocol, NULL, NULL, WSA_FLAG_OVERLAPPED);
Исходя из других языков, похоже, что это какой-то анонимный тип. Как называется функция, если это действительно функция?
Какова его цель?
Его сложно искать, когда не знаешь, с чего начать.
for
выражении цикла * итерация, ala
для (int i = 0, j = 0; i <10; ++ i, --j) ... `i=0;j=0;x=i++,j=6;
x и j были бы 6, а я в любом случае был бы 1. Если поведение i ++ было бы перезаписано, оно осталось бы 0. Но каждый оператор вызывается, и после достижения,
только всех расширений отбрасываются, и вызывается следующая точка псевдопоследовательности. Таким образом, первый=
просто назначает часть после последней,,
но каждая точка вызывается. В любом случае: я не понимаю, почему ваш компилятор не предупреждает вас о переопределении объявления функции, а вместо этого меняет ваш код на что-тоgcc
иg++
с помощью-Wall
опцией сказать:warning: left-hand operand of comma expression has no effect [-Wunused-value]
Ответы:
Оператор запятая † вычисляет левую часть, отбрасывает ее значение и в результате возвращает правую часть.
WSA_FLAG_OVERLAPPED
равно 1, и это результат выражения; все остальные значения отбрасываются. Никаких сокетов не создается.† Если не перегружен. Да, может быть перегружен. Нет, не стоит его перегружать. Отойдите от клавиатуры прямо сейчас!
источник
Оператор запятой помогает понять ваш код.
Вы эффективно устанавливаете,
this->listener = WSA_FLAG_OVERLAPPED;
что просто синтаксически верно.источник
SOCKET
это typedef дляunsigned int
иWSA_FLAG_OVERLAPPED
являетсяint
литералом. ЕслиSOCKET
бы это было синонимомint
, это даже не было бы обращением .struct __socket*
, у нас было бы меньше ошибок. Но существует слишком много кода, который «знает»SOCKET
является неотъемлемой частью.Компилятор по очереди оценивает каждую точку последовательности в круглых скобках, и результатом является последнее выражение
WSA_FLAG_OVERLAPPED
в выражении.Оператор запятая
,
- это точка последовательности в C ++. Выражение слева от запятой полностью вычисляется раньше, чем выражение справа. Результатом всегда является значение справа. Когда у вас есть выражение в форме (x1, x2, x3, ..., xn), результат выражения всегдаxn
.источник