【问题标题】:Declaration can not happen inside a conditional operator expression?声明不能发生在条件运算符表达式中?
【发布时间】:2016-04-15 12:44:04
【问题描述】:

我想知道为什么我不能在下面的表达式中声明一个变量。

string finalgrade = ( ( int grade = 100 ) < 60 ) ? "fail" : "pass"; 

虽然我们可以在 for 语句中声明一个变量。

【问题讨论】:

  • 你为什么要这样做?
  • @TartanLlama 只是好奇,想知道为什么。
  • 这毫无意义。声明将被限定在语句内部,并随语句一起消失。
  • 这对我来说似乎并非完全没有意义,它允许像 std::string name = (Widget const* w = getWidget(id) ? w-&gt;name : "n/a") 这样的构造。

标签: c++ language-lawyer


【解决方案1】:

在 C++ 中,仅允许在声明语句和控制结构 ifwhilefor 内进行声明。

由于声明的目的是引入名称,因此仅当存在名称可见的包含范围时,声明才有意义,这使得这些选项成为唯一合理的选项。声明语句将名称引入周围的范围,三个控制结构各自包含各自的内部范围,各自的声明将名称引入其中。

【讨论】:

    【解决方案2】:

    这只是 C++ 的语法如何定义的问题。您不能将语句放在表达式中并且声明变量是 decl 语句。 for 循环将 decl 语句作为其初始化程序,因此可以在其中声明变量。

    理论上,您编写的代码可以使用一种语法。但这可能会令人困惑。声明变量的范围是什么?程序员需要深入研究表达式,以查看变量是否没有在某处秘密声明。

    【讨论】:

    • 声明变量不是语句。它是一个 decl 语句,,在其他关联上下文中是不合法的,例如由 if/while 控制的单个语句。
    • @EJP 你是什么意思?在 C++ 中,写 if (cond) int x = 0; 是合法的,尽管这毫无意义。
    【解决方案3】:

    我认为这可能对应于这样一个事实,即在 C++ 规范中,像 int var = val 这样的声明/初始化语句是一段基本上等同于其他两个代码的代码:int var 这是 statementvar = 5,它是表达式,并为具有分配值的变量提供一块内存。因此,基本上您要做的是将没有返回值的语句与数字进行比较。

    为了更好地说明它,请尝试运行以下代码:

    int main(){
        int i;
        if ((i = 100) > 60){
            std::cout << "It worked!";
        }
        return 0;
    }
    

    您将看到此代码编译,因为现在您比较返回值和数字的表达式i = 100

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-02-10
      • 1970-01-01
      • 2010-09-15
      • 1970-01-01
      • 2020-03-30
      • 2015-07-19
      • 2019-06-15
      相关资源
      最近更新 更多