【问题标题】:Using strtok in while loop; warning: using the result of an assignment as a condition without parentheses在while循环中使用strtok;警告:使用赋值的结果作为不带括号的条件
【发布时间】:2016-03-20 01:25:35
【问题描述】:

作为更大程序的一部分,我在 while 循环中使用 strtok。

while(cmd2Args[count] = strtok(NULL, " ")){count++;}

但收到以下警告 警告:使用赋值的结果作为不带括号的条件 [-括号]

程序成功编译并按预期运行。 在什么情况下应该考虑这样的警告? 这是糟糕的编程风格吗?

【问题讨论】:

    标签: while-loop warnings strtok


    【解决方案1】:

    是的,这是一种糟糕的编程风格。如果代码完全按照您想要的方式编写,那么您可以忽略警告,但可能并非如此。

    在 C 中,赋值是一个表达式。这意味着代码x = 4; 不仅为x 分配了一个值4,它本身就是一个值4。所以你可以写y = (x = 4);,你的y 的值为4。

    也就是说,while 子句的括号中必须有一个值。

    while(value) { /* loop body */ }
    

    很多时候,您需要比较其中的两个值,例如while(x == 42) { /* do stuff */ }。但是,如果您忘记输入第二个“=”并写 while(x = 42) { /* do stuff */ },会发生什么?

    好吧,你有一个任务,而不是比较。但这是诀窍。它们都是(正确的表达式)。虽然当x42 不同时x == 42 的值为零,但x = 42 的值始终为42 并且将通过条件测试。

    这就是为什么现代编译器在看到whileif 等内部的赋值 时会发出警告。如果代码是正确的,并且您确实希望在其中进行分配,请在其周围添加一组额外的括号。

    while( (cmd2Args[count] = strtok(NULL, " ")) ) {count++}
    

    这让我们回到编译器警告消息:如果您想使用赋值结果作为条件,请在其周围加上括号。

    其他的写法是

    while( (cmd2Args[count] = strtok(NULL, " ")) != 0 ) {count++}
    

    明确程序员的意图。

    【讨论】:

      猜你喜欢
      • 2011-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      • 2010-11-11
      • 1970-01-01
      • 2011-12-08
      相关资源
      最近更新 更多