我偶然发现了一段代码,在调试别人的程序时产生了一些有趣的结果.
我创建了一个小程序来说明这种行为:
#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++第一次不执行.
要解决此问题,您可以使用逗号运算符无条件地评估两者,而不是短路&&.
结果i++是i第一次迭代时其当前值为零.这意味着 iterator++没有对第一次迭代中,由于短circuting(的右侧执行&&时仅执行,如果左侧为"真").
要修复你可以使用逗号运算符(如已建议或)使用++i,它将返回i增量后的值(尽管逗号运算符更明显,必须始终评估两者).
| 归档时间: |
|
| 查看次数: |
232 次 |
| 最近记录: |