【问题标题】:using parenthesis inside an assigment in a while loop?在while循环的赋值中使用括号?
【发布时间】:2020-09-04 21:24:50
【问题描述】:

我很难在我的代码中找到一个错误,结果是我在一个 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]);

【问题讨论】:

  • 这两行代码都有一组额外的括号。应该删除额外的一组括号,因为额外的括号组会禁用编译器为检测此类错误所做的检查。

标签: c while-loop operators


【解决方案1】:

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

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

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

【讨论】:

    【解决方案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。

    【讨论】:

      猜你喜欢
      • 2013-09-25
      • 1970-01-01
      • 2015-03-22
      • 2013-02-17
      • 1970-01-01
      • 2010-11-11
      • 1970-01-01
      • 2013-12-21
      • 2014-12-19
      相关资源
      最近更新 更多