【问题标题】:Assignment of unreferenced variables?未引用变量的赋值?
【发布时间】:2013-12-02 06:15:23
【问题描述】:

我在野外看到了以下代码,我不知道该怎么做:

或多或少:

int main(void)
{
   int a = 0, v;
   printf("%d\n", v); 
} 

这个带有 gcc 的代码将打印出 0。虽然起初我,哦,那是因为初始化的局部变量被分配了 0,但在这种情况下,我从未声明 v 的类型......所以给出了什么?

【问题讨论】:

  • 初始化的局部变量赋值为 0 - 不,它有垃圾。而v的类型是int
  • v 的类型是int。并且行为仍然未定义。 v 的值为indeterminate
  • 在我的机器上我得到 1664045150 而不是 0。你只是碰巧得到 0。
  • FWIW 我认为这个问题的一个更好的标题是“未分配局部变量的值”,因为就目前而言,您的程序没有任何分配给v,也不能调用v unreferenced,因为你……清楚地引用了它! #Pedantic :)
  • 读取未初始化的变量会导致未定义的行为。

标签: c


【解决方案1】:
int a = 0, v;

相当于:

int a = 0;
int v;

所以您确实声明了v 的类型,只是没有明确声明。这是int

无论如何,like all uninitialized local variablesv 的值不能保证是任何值。访问它仍然是未定义的行为;你只是碰巧得到了 0。

【讨论】:

    【解决方案2】:

    您认为逗号在声明语句中的作用是什么?

    在 C - C99 和 C++ 中,初始化程序是声明符的可选部分。 init-declarator-list 是一个逗号分隔的声明符序列,每个声明符都可以有额外的类型信息,或初始化器,或两者兼有。

    因此,您的表达式int a = 0, v; 确实将v 声明为int

    【讨论】:

      【解决方案3】:

      v 的类型是 int。请阅读变量声明的语法。

      你很幸运它打印了 0。v 的值是垃圾。

      【讨论】:

        【解决方案4】:

        来自 ISO/IEC 9899:TC2 第 6.7.8 节语义

        如果具有automatic storage duration 的对象未显式初始化,则为its value is indeterminate
        如果具有静态存储持续时间的对象未显式初始化, 那么:
        — 如果是指针类型,则初始化为空指针;
        — 如果它具有算术类型,则将其初始化为(正或无符号)零;
        — 如果是聚合,则每个成员都根据这些规则(递归地)初始化;
        — 如果它是一个联合,则第一个命名的成员根据这些被初始化(递归) 规则。

        【讨论】:

          【解决方案5】:

          From Wiki,

          一个语句可以声明多个变量,如下所示:

          int anumber, anothernumber, yetanothernumber;
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-01-10
            • 2016-12-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-04-26
            • 2021-08-28
            相关资源
            最近更新 更多