不能同时初始化 4 个以上的变量吗?
Is it not possible to initalize more than 4 variables at once?
void main() {
int a, b, c, d, e = 0;
printf("\n%d", a);
printf("\n%d", b);
printf("\n%d", c);
printf("\n%d", d);
printf("\n%d", e);
}
输出:
16
0
10818512
0
0
由于某些原因,a
始终等于 16,尽管我将其初始化为 0。
另一方面,当我重新运行代码时,c
总是会更改其值。为什么会这样?
我觉得我在这里错过了一些重要的东西。
a is always equal to 16 although I initialize it to 0
不,你没有。
这一行
int a, b, c, d, e = 0;
仅将 e
初始化为 0
。
所有其他变量保持未初始化状态。打印可能会调用未定义的行为。打印的值只是一些东西,垃圾,未定义。
要同时初始化 a
,请执行
int a = 0, b, c, d, e = 0;
Is it not possible to initalize more than 4 variables at once?
一次(显式)初始化多个一个个变量是不可能的。
除了 e
之外的所有变量都未初始化。您需要使用赋值运算符 =
:
显式初始化它们
int a = 0, b = 0, c = 0, d = 0, e = 0;
...
除了涉及 e
的 printf() 语句外,您的 printf() 语句会调用未定义的行为。
你不应该依赖未定义的行为。它可能看起来好像工作正常,但也可能不正常。
只有e
初始化为零。所有其他变量都没有初始化。
有关解释,请参阅 Initialization
Initialization
For each declarator, the initializer, if not omitted, may be one of the following:
...
Implicit initialization
If an initializer is not provided:
- objects with automatic storage duration are initialized to indeterminate values (which may be trap representations)
所以,如果你想初始化每个变量,你必须为每个变量提供一个初始化器,例如
int a = 0, b = 0, c = 0, d = 0, e = 0;
此声明中的所有变量
int a, b, c, d, e = 0;
除最后一个变量e
外没有被初始化。如果它们具有静态存储持续时间,它们将被零初始化。但是这些变量是具有自动存储持续时间的局部变量,不会被编译器隐式初始化。
你需要像
一样初始化每个变量
int a = 0, b = 0, c = 0, d = 0, e = 0;
如果您想一次将所有变量初始化为零,另一种方法是将变量包含在结构中,例如
struct { int a, b, c, d, e; } s = { 0 };
在这种情况下,所有变量都将初始化为零。您可以访问它们,例如 s.a
或 s.b
等等。
这是一个演示程序。
#include <stdio.h>
int main(void)
{
struct { int a, b, c, d, e; } s = { 0 };
printf( "s.a = %d\n", s.a );
printf( "s.b = %d\n", s.b );
printf( "s.c = %d\n", s.c );
printf( "s.d = %d\n", s.d );
printf( "s.e = %d\n", s.e );
return 0;
}
它的输出是
s.a = 0
s.b = 0
s.c = 0
s.d = 0
s.e = 0
void main() {
int a, b, c, d, e = 0;
printf("\n%d", a);
printf("\n%d", b);
printf("\n%d", c);
printf("\n%d", d);
printf("\n%d", e);
}
输出:
16
0
10818512
0
0
由于某些原因,a
始终等于 16,尽管我将其初始化为 0。
c
总是会更改其值。为什么会这样?
我觉得我在这里错过了一些重要的东西。
a is always equal to 16 although I initialize it to 0
不,你没有。
这一行
int a, b, c, d, e = 0;
仅将 e
初始化为 0
。
所有其他变量保持未初始化状态。打印可能会调用未定义的行为。打印的值只是一些东西,垃圾,未定义。
要同时初始化 a
,请执行
int a = 0, b, c, d, e = 0;
Is it not possible to initalize more than 4 variables at once?
一次(显式)初始化多个一个个变量是不可能的。
除了 e
之外的所有变量都未初始化。您需要使用赋值运算符 =
:
int a = 0, b = 0, c = 0, d = 0, e = 0;
...
除了涉及 e
的 printf() 语句外,您的 printf() 语句会调用未定义的行为。
你不应该依赖未定义的行为。它可能看起来好像工作正常,但也可能不正常。
只有e
初始化为零。所有其他变量都没有初始化。
有关解释,请参阅 Initialization
Initialization
For each declarator, the initializer, if not omitted, may be one of the following:...
Implicit initialization
If an initializer is not provided:
- objects with automatic storage duration are initialized to indeterminate values (which may be trap representations)
所以,如果你想初始化每个变量,你必须为每个变量提供一个初始化器,例如
int a = 0, b = 0, c = 0, d = 0, e = 0;
此声明中的所有变量
int a, b, c, d, e = 0;
除最后一个变量e
外没有被初始化。如果它们具有静态存储持续时间,它们将被零初始化。但是这些变量是具有自动存储持续时间的局部变量,不会被编译器隐式初始化。
你需要像
一样初始化每个变量int a = 0, b = 0, c = 0, d = 0, e = 0;
如果您想一次将所有变量初始化为零,另一种方法是将变量包含在结构中,例如
struct { int a, b, c, d, e; } s = { 0 };
在这种情况下,所有变量都将初始化为零。您可以访问它们,例如 s.a
或 s.b
等等。
这是一个演示程序。
#include <stdio.h>
int main(void)
{
struct { int a, b, c, d, e; } s = { 0 };
printf( "s.a = %d\n", s.a );
printf( "s.b = %d\n", s.b );
printf( "s.c = %d\n", s.c );
printf( "s.d = %d\n", s.d );
printf( "s.e = %d\n", s.e );
return 0;
}
它的输出是
s.a = 0
s.b = 0
s.c = 0
s.d = 0
s.e = 0