在 while 循环中的赋值内使用括号?

using parenthesis inside an assigment in a while loop?

我在尝试查找我的代码中的错误时遇到了非常糟糕的时间,结果是我在 while 循环中遗漏了一对括号,我仍然不知道它的重要性。

为什么这些行彼此不同:

 while (( (bytes_read = read(inputFILE, buffer, BUFF_SIZE)) > 0))
 while (( bytes_read = read(inputFILE, buffer, BUFF_SIZE) > 0))

第二行是导致当我尝试将缓冲区写入文件时无论如何只写入一个字符的错误。这对额外的括号做了什么改变

正确行的整个循环是:

while (( (bytes_read = read(inputFILE, buffer, BUFF_SIZE)) > 0)){
        bytes_write = write(outputFILE, buffer, bytes_read);
        if (bytes_write != bytes_read)
            fatal("Couldnt write data to %s", argv[2]);

区别是:

(something = something_else) > 0

(将 something_else 赋给 something,然后检查它是否大于零)

相比于:

something = something_else > 0

相同
something = (something_else > 0)

(检查 something_else 是否大于 0,然后将其分配给 something)。

第一个将something_else的实际值存储在变量something中。第二个只存储 1 或 0,具体取决于它是否大于 0。

关系运算符 > 的优先级高于赋值运算符 =。所以第二行代码解析为:

while (( bytes_read = (read(inputFILE, buffer, BUFF_SIZE) > 0)) )

换句话说,read 的 return 值与 0 进行比较,然后将结果(0 或 1)分配给 bytes_read