这个C ++功能的名称是什么?

时间:2014-11-18 10:12:29

标签: c++

我正在编写一些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);

来自其他语言,这个看起来就好像它可能是某种匿名类型。该功能的名称是什么,如果它真的是一个功能?

它的目的是什么?

当你不知道从哪里开始时,很难找到它。

3 个答案:

答案 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