C程序有趣的行为

Ion*_*lub 6 c for-loop

我偶然发现了一段代码,在调试别人的程序时产生了一些有趣的结果.

我创建了一个小程序来说明这种行为:

#include <stdio.h>

int main()
{
        char* word = "foobar"; int i, iterator = 0;
        for (i = 0; i < 6; i++ && iterator++)
          printf("%c", word[iterator]);
        return 0;
}
Run Code Online (Sandbox Code Playgroud)

我知道这不是打印字符串的正确方法.这仅用于演示目的.

在这里,我预计输出是"foobar",显然,但它是"ffooba".基本上它会两次读取第一个字符,好像第一次iterator++执行时没有任何反应.

谁能解释为什么会这样?

ick*_*fay 11

事情iterator++实际上第一次没有执行.的++操作者返回一个变量的当前值和然后增加,所以第一次通过,i++将等于0.&&短路,所以iterator++第一次不执行.

要解决此问题,您可以使用逗号运算符无条件地评估两者,而不是短路&&.


hmj*_*mjd 5

结果i++i第一次迭代时其当前值为零.这意味着 iterator++没有对第一次迭代中,由于短circuting(的右侧执行&&执行,如果左侧为"真").

要修复你可以使用逗号运算符(如已建议或)使用++i,它将返回i增量后的值(尽管逗号运算符更明显,必须始终评估两者).