我正在编写一些C ++代码,并错误地省略了函数WSASocket
的名称。但是,我的编译器没有引发错误并将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);
来自其他语言,这个看起来就好像它可能是某种匿名类型。该功能的名称是什么,如果它真的是一个功能?
它的目的是什么?
当你不知道从哪里开始时,很难找到它。
答案 0 :(得分:151)
逗号运算符†评估左侧,丢弃其值,结果产生右侧。 WSA_FLAG_OVERLAPPED
为1,这是表达式的结果;所有其他值都被丢弃。没有创建套接字。
†除非超载。是的,它可以超载。不,你不应该超载它。现在就离开键盘!
答案 1 :(得分:22)
逗号运算符正在理解您的代码。
您正在有效地设置恰好在语法上有效的this->listener = WSA_FLAG_OVERLAPPED;
。
答案 2 :(得分:21)
编译器在括号内依次评估每个sequence point,结果是表达式中的最终表达式WSA_FLAG_OVERLAPPED
。
逗号运算符,
是C ++中的序列点。在右边的表达式之前,将完全评估逗号左侧的表达式。结果始终是右边的值。当你有一个表达式(x1,x2,x3,...,xn)时,表达式的结果总是xn
。