我的这部分代码工作正常:
#include <stdio.h>
int main(){
//char somestring[3] = "abc";
int i, j;
int count = 5;
for((i=0) && (j=0); count > 0; i++ && j++){
printf("i = %d and j = %d\n", i, j);
count--;
}
return 0;
}
预期的输出:
i : 0 and j : 0
i : 1 and j : 1
i : 2 and j : 2
i : 3 and j : 3
i : 4 and j : 4
当我取消注释函数体第一行的 char 字符串声明时,事情变得很奇怪。
#include <stdio.h>
int main(){
char somestring[3] = "abc";
...
}
输出:
i : 0 and j : 4195392
i : 1 and j : 4195393
i : 2 and j : 4195394
i : 3 and j : 4195395
i : 4 and j : 4195396
这背后的逻辑是什么?我在 Ubuntu 9.10 上使用 gcc 4.4.1。
最佳答案
j
永远不会被初始化,因为 short-circuiting behaviour &&
。由于 (i=0)
的计算结果为假,(j=0)
永远不会被执行,因此 j
得到一个随机值。在第一个示例中,它恰好为零。
你应该说 i=0, j=0
来实现你想要的。
i++ && j++
也有同样的问题;它应该是 i++, j++
。
另外,这个:
char somestring[3] = "abc";
保留的字节太少,因为字符串中尾随 NUL 字符 - 您需要四个字节。但是如果你不打算修改字符串,你不需要指定字节数 - 你可以简单地说:
char *somestring = "abc";
相反。
关于c - 需要一些帮助来理解奇怪的 C 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2614779/