需要一些帮助来理解奇怪的C行为

时间:2010-04-10 20:05:23

标签: c

我的代码的这部分工作正常:

#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。

5 个答案:

答案 0 :(得分:18)

由于j的{​​{3}},

&&永远不会被初始化。由于(i=0)的计算结果为false,(j=0)永远不会被执行,因此j会获得随机值。在第一个例子中,恰好是零。

你应该说i=0, j=0来实现你想要的目标。

i++ && j++有同样的问题;它应该是i++, j++

另外,这个:

char somestring[3] = "abc";

保留一个太少的字节,因为字符串中有尾随的NUL字符 - 你需要四个字节。但是,如果您不打算修改字符串,则无需指定字节数 - 您可以这样说:

char *somestring = "abc";

代替。

答案 1 :(得分:2)

如果您使用&amp;&amp;,则只有第一个参数被判断为否则会被评估。 i = 0为false,因此j不会设置为0.您应该使用komma运算符:

for((i=0) , (j=0); count > 0; i++, j++){ [...]

答案 2 :(得分:1)

for((i=0) && (j=0)...似乎已经不正确了。
i=0的值已经为0,因此不需要对j=0进行评估,因此会跳过它。

由于同样的原因,第一次迭代

(i++) && (j++)似乎也是错误的。

答案 3 :(得分:0)

您正在使用(i==0) && (j==0)初始化循环中的两个变量。

然而,&amp;&amp;如果第一个操作数的计算结果为FALSE(即0),则永远不会执行第二个操作数。因此,当我为0时,j未被初始化。在您的第一次运行中,您只是幸运它碰巧包含值0。

答案 4 :(得分:0)

你的变量i&amp; j未初始化。 (i=0) && (j=0)是什么意思? 编译器将创建一个快捷方式,并且仅指定i=0 j未使用您描述的效果进行初始化。