生病的代码片段

Whi*_*awn 2 c++

有人可以告诉我以下两个代码片段之间的区别:

//Code snippet A: Compiles fine
int main()
{
    if(int i = 2)
    {
        i = 2 + 3;
    }
    else
    {
        i = 0;
    }
}

//Code Snippet B: Doesn't compile :(
int main()
{
    if((int i = 2))
    {
        i = 2 + 3;
    }
    else
    {
        i = 0;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果你注意到diff只是if语句的一个额外括号.我正在使用g ++ compiler.Error是"在âint之前预期的primary-expression"

pax*_*blo 18

C++标准的第6.4节(c ++ 0x的草案n2914)有关于if语句格式的说法:

选择语句选择几个控制流之一.
   selection-statement:
      if ( condition ) statement
      if ( condition ) statement else statement
      switch ( condition ) statement
   condition:
      expression
      type-specifier-seq attribute-specifieropt declarator = initializer-clause
      type-specifier-seq attribute-specifieropt declarator braced-init-list

最后一点意味着条件可以是表达式 decalarator类型构造.

在解析器点击第二个括号的那一刻,它就变成了一个表达式,所以没有声明允许,我害怕.

片段:

if (int i = 2) { ... } else { ... }
Run Code Online (Sandbox Code Playgroud)

是完全有效的C++,其中if部分定义了一个整数i,并将其if/else设置为2.然后使用该2作为输入if(2总是为真,非零).

该片段if((int i = 2))是没有什么不同语法到int x = (int i = 2;); if (x)这是合法的C++.


Mik*_*our 10

片段A很好 - if条件delares并初始化一个可以解释为布尔值的变量.变量在if和任何else块中定义.

片段B是错误的,因为你不能在声明周围添加括号 - 你只能将它们放在圆形表达式中.出于同样的原因,以下内容也是错误的:

int main()
{
    int i;       // OK
    (i = 2);     // OK

    (int x = 2); // compile error
}
Run Code Online (Sandbox Code Playgroud)


Rom*_*nko 5

这是第二个代码段错误的另一种变体:

int main()
{
    int i = (int j = 0);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

您不能在ANY表达式中声明变量.Second()里面的for是相同的情况 - 你可以在()内部声明变量i,但不能在放入()的嵌套表达式中声明.

希望我用恰当的语言解释它,也许更正确的解释存在.实际上两个代码片段都是奇怪的.