在 while 循环中使用 strtok;警告:将赋值结果用作不带括号的条件
Using strtok in while loop; warning: using the result of an assignment as a condition without parentheses
作为一个更大程序的一部分,我在 while 循环中使用了 strtok。
while(cmd2Args[count] = strtok(NULL, " ")){count++;}
但是收到以下警告
警告:将赋值结果用作不带括号的条件
[-W括号]
程序成功编译并按预期运行。
在什么情况下应该考虑这样的警告?
这是糟糕的编程风格吗?
是的,这是糟糕的编程风格。如果代码完全按照您想要的方式编写,那么您可以忽略警告,但事实可能并非如此。
在 C 中,赋值是一个表达式。这意味着代码 x = 4;
不仅将值 4 分配给 x
,它本身就是一个值 4。所以你可以写 y = (x = 4);
而你的 y
的值为 4.
也就是说,while
子句的括号中必须有一个值。
while(value) { /* loop body */ }
很多时候,您需要比较其中的两个值,例如 while(x == 42) { /* do stuff */ }
。但是,如果您忘记输入第二个“=”并写成 while(x = 42) { /* do stuff */ }
会怎样?
好吧,你有一个任务,而不是比较。但这是诀窍。它们都是 values(表达式,正确)。当 x
不同于 42
时 x == 42
的值为零,而 x = 42
将始终具有 42
的值并且将通过条件测试。
这就是为什么现代编译器在 while
、if
等中看到 赋值 时发出警告的原因。如果代码是正确的并且你真的想在那里进行赋值,请在它周围加上一组额外的括号。
while( (cmd2Args[count] = strtok(NULL, " ")) ) {count++}
这让我们回到编译器警告消息:如果您想使用赋值的结果作为条件,请将其括起来。
其他的写法是
while( (cmd2Args[count] = strtok(NULL, " ")) != 0 ) {count++}
明确程序员的意图。
作为一个更大程序的一部分,我在 while 循环中使用了 strtok。
while(cmd2Args[count] = strtok(NULL, " ")){count++;}
但是收到以下警告 警告:将赋值结果用作不带括号的条件 [-W括号]
程序成功编译并按预期运行。 在什么情况下应该考虑这样的警告? 这是糟糕的编程风格吗?
是的,这是糟糕的编程风格。如果代码完全按照您想要的方式编写,那么您可以忽略警告,但事实可能并非如此。
在 C 中,赋值是一个表达式。这意味着代码 x = 4;
不仅将值 4 分配给 x
,它本身就是一个值 4。所以你可以写 y = (x = 4);
而你的 y
的值为 4.
也就是说,while
子句的括号中必须有一个值。
while(value) { /* loop body */ }
很多时候,您需要比较其中的两个值,例如 while(x == 42) { /* do stuff */ }
。但是,如果您忘记输入第二个“=”并写成 while(x = 42) { /* do stuff */ }
会怎样?
好吧,你有一个任务,而不是比较。但这是诀窍。它们都是 values(表达式,正确)。当 x
不同于 42
时 x == 42
的值为零,而 x = 42
将始终具有 42
的值并且将通过条件测试。
这就是为什么现代编译器在 while
、if
等中看到 赋值 时发出警告的原因。如果代码是正确的并且你真的想在那里进行赋值,请在它周围加上一组额外的括号。
while( (cmd2Args[count] = strtok(NULL, " ")) ) {count++}
这让我们回到编译器警告消息:如果您想使用赋值的结果作为条件,请将其括起来。
其他的写法是
while( (cmd2Args[count] = strtok(NULL, " ")) != 0 ) {count++}
明确程序员的意图。