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

Mom*_*gil 0 c c++ boolean-operations assign

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

if ((socket_obj->client_fd = accept(socket_obj->server_fd, (struct sockaddr *)&socket_obj->client_address, &fromlen)) < 0)
Run Code Online (Sandbox Code Playgroud)

如果我理解正确,该行正在调用返回整数值的socket.h函数accept.函数完成后,将该值赋值给socket_obj->client_fd然后,如果它低于0,则计算赋值操作.

但是它不会总是高于0,因为值赋值的布尔结果总是为真吗?我的意思是,以下行不会总是返回true吗?

if (myVariable = 0)
Run Code Online (Sandbox Code Playgroud)

我首先认为这是一个错误的编码并更改了代码所以首先发生赋值socket_obj->client_fd,然后内部的值被计算为0,但后来我在代码中找到了相同情况发生的另一个地方,所以我不能认为它是一个孤立的错误.

那么,我想知道我的解释是否正确.

Sva*_*zen 6

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

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

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

int x, y;
x = y = 4; // both x and y are 4 now
Run Code Online (Sandbox Code Playgroud)

这相当于:

x = ( y = 4 );
Run Code Online (Sandbox Code Playgroud)

而且,由于y的任务返回分配给该值y,这是4,x也得到它.


Ant*_*vin 5

在C和C++中,内置赋值运算符在赋值后返回其左操作数.所以行

if ((socket_obj->client_fd = accept(...)) < 0)
Run Code Online (Sandbox Code Playgroud)

执行以下操作:

  1. 呼叫 accept()
  2. 将结果分配给socket_obj->client_fd.
  3. socket_obj->client_fd与之相比0.