分析变量赋值的布尔结果是否有意义?

时间:2014-10-22 16:19:36

标签: c++ c assign boolean-operations

我刚才正在阅读代码,我发现另一个程序员编写了一个非常奇怪的代码行:

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,但后来我在代码中找到了相同情况发生的另一个地方,所以我不能认为这是一个孤立的错误。

我想知道,如果我的解释是正确的。

2 个答案:

答案 0 :(得分:6)

作业不会返回true。自己试试吧。赋值返回已分配的值。

int main() {
    int a;
    std::cout << ( (a = 0) ? "true" : "false" ) << '\n';
    return 0;
}

请注意,结果值不必是truefalse。例如,这就是您可以这样做的原因:

int x, y;
x = y = 4; // both x and y are 4 now

这相当于:

x = ( y = 4 );

由于y的分配会返回分配给y的值,4x也会获得该值。

答案 1 :(得分:5)

在C和C ++中,内置赋值运算符在赋值后返回其左操作数。这一行

if ((socket_obj->client_fd = accept(...)) < 0)

执行以下操作:

  1. 致电accept()
  2. 将结果分配给socket_obj->client_fd
  3. socket_obj->client_fd0进行比较。