【问题标题】:Is it not possible to initalize more than 4 variables at once?不能一次初始化超过 4 个变量吗?
【发布时间】:2020-03-07 11:33:03
【问题描述】:
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 总是在我重新运行代码时更改其值。为什么会这样?

我觉得我在这里错过了一些重要的事情。

【问题讨论】:

  • 不相关:首选printf("%d\n", value);格式字符串末尾有换行符。
  • 为什么投反对票?这是一个正式完整的问题。
  • @alk(不是我的投票)“这个问题没有显示任何研究工作”。任何关于初始化的参考都将涵盖它。猜测语言语义在 C 中并不遥远
  • 您最好将int a, b, c, d, e = 0; 之类的代码拆分为每个变量一行。将它们全部放在一条线上,您将一无所获。教科书这样做是因为在书的长度上,这种格式可以节省几页,而成千上万的教科书可以节省几页,这使得出版公司的首席执行官可以为他的游泳池买单。 “代码简洁”只不过是一句货物崇拜的格言。重要的是可读性和可维护性。每行一个变量更易于阅读和维护代码,因为您可以轻松找到并更改它们。

标签: c initialization declaration


【解决方案1】:

只有e 被初始化为零。所有其他变量都未初始化。 解释见Initialization

初始化
对于 each 声明符,如果没有省略,初始化器可能是以下之一:

...

隐式初始化
如果未提供初始化程序:

  • 具有自动存储持续时间的对象被初始化为不确定的值(可能是陷阱表示)

所以,如果你想初始化每个变量,你必须为每个变量提供一个初始化器,例如

int a = 0, b = 0, c = 0, d = 0, e = 0;

【讨论】:

    【解决方案2】:

    a 始终等于 16,尽管我将其初始化为 0

    不,你没有。

    这一行

    int a, b, c, d, e = 0;
    

    仅将 e 初始化为 0

    所有其他变量保持未初始化。打印可能会调用未定义的行为。打印的值只是一些东西,垃圾,未定义。

    要初始化a,也可以这样做

    int a = 0, b, c, d, e = 0;
    

    不能同时初始化4个以上的变量吗?

    甚至不可能一次(显式)初始化多个一个变量。

    【讨论】:

    • 嗯,那么逗号是如何工作的呢?为什么b、c、d都初始化为0?
    • @NicolasPeyer:“为什么 b、c 和 d 初始化为 0?”它们不是。他们的价值观是不确定的。正如你自己写的那样:“另一方面,当我重新运行代码时,c 总是改变它的值
    • 有没有办法一次将多个变量初始化为相同的值?
    • "有没有办法一次将多个变量初始化为相同的值?"不,没有。
    • 考虑到标准,“可能”相当温和。
    【解决方案3】:

    e 之外的所有变量都未初始化。您需要使用赋值运算符 = 显式初始化它们:

    int a = 0, b = 0, c = 0, d = 0, e = 0;
    ...
    

    除了涉及e 的之外,您的 printf() 语句会调用未定义的行为。

    您不应该依赖未定义的行为。它可能看起来好像正常工作,但可能没有。

    【讨论】:

      【解决方案4】:

      此声明中的所有变量

      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.as.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
      

      【讨论】:

        猜你喜欢
        • 2018-10-29
        • 1970-01-01
        • 2015-08-23
        • 1970-01-01
        • 1970-01-01
        • 2016-04-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多