我刚才正在阅读代码,我发现另一个程序员编写了一个非常奇怪的代码行:
if ((socket_obj->client_fd = accept(socket_obj->server_fd, (struct sockaddr *)&socket_obj->client_address, &fromlen)) < 0)
如果我理解正确,该行正在调用socket.h
函数accept
,它返回一个整数值。函数完成后,此值将分配给socket_obj->client_fd
,然后,如果分配操作低于0,则对其进行评估。
但是,由于值赋值的布尔结果总是为真,它不会总是高于0吗?我的意思是,以下行不会总是返回true吗?
if (myVariable = 0)
我首先认为这是一个错误的编码并更改了代码,因此首先发生赋值,然后socket_obj->client_fd
内的值被计算为0,但后来我在代码中找到了相同情况发生的另一个地方,所以我不能认为这是一个孤立的错误。
我想知道,如果我的解释是正确的。
答案 0 :(得分:6)
作业不会返回true
。自己试试吧。赋值返回已分配的值。
int main() {
int a;
std::cout << ( (a = 0) ? "true" : "false" ) << '\n';
return 0;
}
请注意,结果值不必是true
或false
。例如,这就是您可以这样做的原因:
int x, y;
x = y = 4; // both x and y are 4 now
这相当于:
x = ( y = 4 );
由于y
的分配会返回分配给y
的值,4
,x
也会获得该值。
答案 1 :(得分:5)
在C和C ++中,内置赋值运算符在赋值后返回其左操作数。这一行
if ((socket_obj->client_fd = accept(...)) < 0)
执行以下操作:
accept()
socket_obj->client_fd
。socket_obj->client_fd
与0
进行比较。