我在野外看到了以下代码,我不知道该怎么做:
或多或少:
int main(void)
{
int a = 0, v;
printf("%d\n", v);
}
这个带gcc的代码将打印出来0.首先我很好,因为初始化的局部变量被赋值为0,但是在这种情况下我从未声明过v的类型...所以给出了什么?
答案 0 :(得分:4)
int a = 0, v;
相当于:
int a = 0;
int v;
所以你 声明v
的类型,只是没有明确说明。这是一个int
。
无论如何,like all uninitialized local variables,v
的价值不保证是任何东西。访问它仍然是未定义的行为;你碰巧得到了0。
答案 1 :(得分:1)
您认为逗号在声明声明中的作用是什么?
在C-C99和C ++中,初始化程序是声明符的可选部分。 init-declarator-list是一个以逗号分隔的声明符序列,每个声明符都可以包含其他类型信息,或初始值设定项,或两者兼而有之。
因此,您的表达式int a = 0, v;
确实将v
声明为int
。
答案 2 :(得分:1)
v
的类型为int
。请阅读变量声明的语法。
你很幸运它正在打印0. v
的值是垃圾。
答案 3 :(得分:1)
来自 ISO / IEC 9899:TC2 部分6.7.8语义
如果automatic storage duration
的对象未明确初始化,its value is indeterminate
。
如果未明确初始化具有静态存储持续时间的对象,
然后:
- 如果它有指针类型,则将其初始化为空指针;
- 如果它具有算术类型,则将其初始化为(正或无符号)零;
- 如果是聚合,则根据这些规则初始化(递归)每个成员;
- 如果它是一个联合,则根据这些初始化(递归)第一个命名成员
规则。
答案 4 :(得分:0)