Estaba escribiendo código C ++ y omití por error el nombre de una función WSASocket. Sin embargo, mi compilador no generó un error y asoció my SOCKETcon el valor entero 1 en lugar de un socket válido.
El código en cuestión debería haberse visto así:
this->listener = WSASocket(address->ai_family, address->ai_socktype, address->ai_protocol, NULL, NULL, WSA_FLAG_OVERLAPPED);
Pero en cambio, se veía así:
this->listener = (address->ai_family, address->ai_socktype, address->ai_protocol, NULL, NULL, WSA_FLAG_OVERLAPPED);
Viniendo de otros idiomas, parece que puede ser algún tipo de tipo anónimo. ¿Cuál es el nombre de la función, en caso de que sea realmente una función?
¿Cual es su propósito?
Es difícil buscarlo cuando no sabes por dónde empezar.

forexpresión de iteración de bucle *, alapara (int i = 0, j = 0; i <10; ++ i, --j) ... `i=0;j=0;x=i++,j=6;serían 6 y yo sería de todos modos 1. Si el comportamiento de i ++ se sobrescribiera, permanecería 0. Pero cada declaración se invoca y después de alcanzar,solo todas las extensiones se descartan y se invoca el siguiente pseudopunto de secuencia. Entonces, el primero=simplemente asigna la parte después del último,,pero se invoca cada punto. De todos modos: no entiendo por qué su compilador no le advierte sobre la redefinición de la declaración de función y, en cambio, cambia su código a algo de comportamiento diferentegccyg++con la-Wallopción diga:warning: left-hand operand of comma expression has no effect [-Wunused-value]Respuestas:
El operador de coma † evalúa el lado izquierdo, descarta su valor y, como resultado, produce el lado derecho.
WSA_FLAG_OVERLAPPEDes 1, y ese es el resultado de la expresión; todos los demás valores se descartan. Nunca se crea ningún socket.† A menos que esté sobrecargado. Sí, se puede sobrecargar. No, no debes sobrecargarlo. ¡Aléjate del teclado, ahora mismo!
fuente
El operador de coma le da sentido a su código.
De hecho, está configurando lo
this->listener = WSA_FLAG_OVERLAPPED;que resulta ser sintéticamente válido.fuente
SOCKETes un typedef paraunsigned intyWSA_FLAG_OVERLAPPEDes unintliteral. SiSOCKETfuera un sinónimo deint, ni siquiera sería una conversión .struct __socket*, tendríamos menos errores. Pero hay demasiado código por ahí que "sabe" queSOCKETes integral.El compilador está evaluando cada punto de secuencia a su vez dentro del paréntesis y el resultado es la expresión final,
WSA_FLAG_OVERLAPPEDen la expresión.El operador de coma
,es un punto de secuencia en C ++. La expresión a la izquierda de la coma se evalúa por completo antes que la expresión a la derecha. El resultado es siempre el valor de la derecha. Cuando tienes una expresión de la forma (x1, x2, x3, ..., xn) el resultado de la expresión es siemprexn.fuente