在while循环中使用strtok;警告:使用赋值结果作为没有括号的条件

时间:2016-03-20 01:25:35

标签: while-loop warnings strtok

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

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

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

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

1 个答案:

答案 0 :(得分:1)

是的,这是糟糕的编程风格。如果代码是按照您想要的方式编写的,那么您可以忽略该警告,但可能不是这样。

在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 */ }

会发生什么

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

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

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

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

其他写作方式是

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

程序员的意图明确。