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 SOCKET
con 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.
for
expresión de iteración de bucle *, ala
para (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 diferentegcc
yg++
con la-Wall
opció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_OVERLAPPED
es 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
SOCKET
es un typedef paraunsigned int
yWSA_FLAG_OVERLAPPED
es unint
literal. SiSOCKET
fuera 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" queSOCKET
es 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_OVERLAPPED
en 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