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

标签 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。

最佳答案

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/

相关文章:

c - 为什么在引用 int 变量的大小时必须使用 %ld?

c - 有没有更好的方法来定义用于进行位操作的预处理器宏?

c++ - 类型 "incompatible types when assigning to type ‘char[100]’ 的错误消息 ‘char *’“

c - 如何在openmp嵌套for循环中实现break函数

c - 队列的 pop() 中的内存泄漏

C非阻塞键盘输入

c - 在 C 中与系统调用同步

c - 什么会导致 gettimerid() 失败,将 errno 设置为 ENOSPC(未记录)?

c - 将 CSV 文本文件中的值输入到数组中

c - 多条件同时测试(C语言)