【发布时间】:2015-01-15 11:40:01
【问题描述】:
我正在编写一些 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);
来自其他语言,这个看起来可能是某种匿名类型。该功能的名称是什么,如果它真的是一个功能?
它的目的是什么?
当您不知道从哪里开始时,很难搜索它。
【问题讨论】:
-
+1,酒吧测验的好问题(对于喜欢雇用擅长脑筋急转弯的人的公司来说,这是一个骇人听闻的面试问题)。
-
链接到Wikipedia article on comma operator。 FWIW,常见用途之一是在
for循环中获得两个副作用 *迭代表达式, alafor (int i = 0, j = 0; i -
@MichaelJ.Gray 从技术上讲你错了。它不会覆盖行为。想象一下:
i=0;j=0;x=i++,j=6;x 和 j 将是 6,而 i 无论如何都会是 1。如果 i++ 的行为将被覆盖,它将保持为 0。但是每个语句都会被调用,并且在达到,之后,所有扩展都会被丢弃,并且下一个伪序列点被调用。所以第一个=只是分配最后一个,之后的部分,但每个点都会被调用。无论如何:我不明白为什么您的编译器不会在重新定义函数声明时警告您,而是将您的代码更改为不同的行为 -
如果您使用适当的编译器,并打开警告,它会警告此类狡猾的代码,例如
gcc和g++与-Wall选项说:warning: left-hand operand of comma expression has no effect [-Wunused-value]跨度> -
所以,在我看来,这个问题的最佳答案是“始终启用警告”——然后编译器本身会解释存在错误并告诉你你做了什么;这个答案也将为您解决许多其他问题。
标签: c++