【问题标题】:How does the c++ compiler handle types declared inside conditionals?c++ 编译器如何处理条件中声明的类型?
【发布时间】:2014-10-08 17:58:35
【问题描述】:

例如:

if ((rand() % 100) < 50)
    string value = "123";
else
    int value = 123;

编译器是否知道 value 可以有两种可能的类型?这在内部是如何表示的?

【问题讨论】:

  • 它没有。任何计算为零的都是假的,其他的都是真的。
  • juanchopanza,必须在运行时评估的条件呢?
  • 他们得到评估,如果他们不是 0,他们就是真的。
  • 谷歌programming scope

标签: c++ gcc types compilation


【解决方案1】:

就编译器而言,这与:

if ((rand() % 100) < 50)
    string aaa = "123";
else
    int bbb = 123;

即您在两个不同的范围内使用相同的名称这一事实完全无关紧要。

如果条件为真,编译器在堆栈上创建一个string,否则它在堆栈上创建一个int。你在源代码中给这些对象起的名字是无关紧要的。

有两种不同的对象,有两种不同的类型,但在运行时创建哪一种取决于条件。

在进入函数时,编译器将为string 和int 中较大的一个保留足够的堆栈空间,然后在运行时在该内存位置初始化一个字符串或一个int,如果sizeof(string) != sizeof(int) 然后一些保留的堆栈空间将在某些执行中未使用。

【讨论】:

    【解决方案2】:

    这并没有声明一个变量的类型在运行时确定(或神奇地具有两种类型),而是实际上是两个独立变量,每个变量都有自己的静态类型和受限于其范围的生命周期.

    每个value 只在其自己的范围内是活动的,如果加上大括号会更清楚

    if ((rand() % 100) < 50) {
        string value = "123";
        // 'value' refers to the string
    }
    else {
        int value = 123;
        // 'value' refers to the integer
    }
    // neither 'value' is alive here
    

    编译器不关心变量名,它们只为人类程序员提供信息。这里没有名称冲突,变量也可以命名不同。

    【讨论】:

      【解决方案3】:

      编译器将为 2 个分支考虑 2 个不同的范围。如果您尝试在分支之外使用“value”,而之前没有声明它会引发错误。 (未定义的标识符)

      如果你不在每个分支上用“value”做一些东西,你的构造就没有意义。

      例如,如果你这样做:

      int value = 10;
      value = 5;
      
      if ((rand() % 100) < 50)
          string value = "123"
      else
          int value = 123
      
      printf("%d\n", value);
      

      它将输入 5。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-29
        • 1970-01-01
        • 2011-05-16
        • 2014-06-04
        • 1970-01-01
        • 2013-09-22
        相关资源
        最近更新 更多