首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在一行中声明多个变量时,C中的值赋值

在一行中声明多个变量时,C中的值赋值
EN

Stack Overflow用户
提问于 2021-06-02 08:10:16
回答 1查看 1.2K关注 0票数 1

我正在处理多个变量的单行声明和初始化,并注意到在C中有些异常。

代码语言:javascript
运行
复制
#include <stdio.h>

int main() {
    int a, c, d, e = 0;
    printf("a = %d, c = %d, d = %d, e = %d", a, c, d, e);
}

因此,上述程序的输出是

代码语言:javascript
运行
复制
a = 2961408, c = 0, d = 4200720, e = 0

容易,因为e被指定为0和rest,它们都可能是垃圾值,但是c值为0。我把代码更改为

代码语言:javascript
运行
复制
#include <stdio.h>

int main() {
    int a, b, c, d, e = 0;
    printf("a = %d, b = %d, c = %d, d = %d, e = %d", a, b, c, d, e);
}

这一次的产出是:

代码语言:javascript
运行
复制
a = 2297856, b = 0, c = 4200736, d = 4200848, e = 0

第二个变量被初始化为0 b,以前的c以及e和rest都是垃圾。

对于34567等变量,每次声明中的第二个变量与最后一个变量一起初始化值0时,都会注意到同样的情况。

这不是初始化最后一个变量的情况,而是如果我在第二个变量之后给任何变量赋值0。我的第二个变量获得0作为初始化值。是我的编译器出了什么问题,还是在C中有一些逻辑?

代码语言:javascript
运行
复制
#include <stdio.h>

int main() {
    int a, b, c, d, e, g = 10, f;
    printf("a = %d, b = %d, c = %d, d = %d, e = %d, g = %d, f = %d", a, b, c, d, e, g, f);
}

输出:

代码语言:javascript
运行
复制
a = 3702784, b = 0, c = 4200752, d = 4200864, e = 6422400, g = 10, f = 4200752

我的C编译器是gcc (MinGW.org GCC Build-2) 9.2.0

EN

Stack Overflow用户

回答已采纳

发布于 2021-06-02 09:42:37

我的编译器有问题吗?

不是的。

或者这在C中有什么逻辑吗?

不是的。

读取未初始化的本地值会给出不确定的值。这就是所谓的未定义的行为--你首先需要理解的是这意味着什么。正如我在这里所写的,什么是未定义的行为,它是如何工作的?

重要的是要调查行为不明确的原因,而不是症状。初学者通常会问,当他们做了一些没有定义的事情时,为什么会发生某种行为,但从调查结果中往往没有什么可学到的。最好把时间花在学习是什么导致了这种不确定的行为上。

现在,这是未定义行为的原因实际上是因为您没有使用那些未初始化的局部变量的地址,请参见这个答案:(为什么)使用未初始化的变量未定义的行为?,所以程序可能会崩溃。

撇开这个问题不谈,在许多系统上,不定值显示为打印任何碰巧存储在RAM中的随机位置的东西。RAM内存的工作方式,我们从不“删除”或“擦除”任何东西从它。我们只需跟踪使用的位置,然后当它们不再被使用时,不管存储在那里的是什么,都会被保留下来。

但是没有任何保证,所以优化的编译器也可以打印一些随机CPU寄存器的内容。再说一次,没有什么有意义的东西可以从中学习。你不妨掷一些骰子,然后找出你得到某些价值的原因。

一些糟糕的编译器利用“调试构建”,将整个RAM设置为零,因此在这样的系统上,您将得到所有的零。这是不好的,因为它隐藏了bug,直到您从调试切换到发布。

无论如何,从中学习到的唯一重要的东西是gcc/mingw会抱怨如果你使用-Wall的话,非非独立变量。作为初学者,养成用以下方式编译的习惯:

代码语言:javascript
运行
复制
gcc -std=c11 -pedantic-errors -Werror -Wall -Wextra
票数 3
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67801305

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档