生病的代码片段

时间:2009-11-11 13:31:53

标签: 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;
    }
}

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

4 个答案:

答案 0 :(得分: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 { ... }

是完全有效的C ++,其中if部分在i的持续时间内定义整数if/else并将其设置为2.然后使用该2作为{{1}的输入}(2总是如此,非零)。

代码段if在语法上与 无效C ++的if((int i = 2))没有什么不同。

答案 1 :(得分:10)

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

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

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

    (int x = 2); // compile error
}

答案 2 :(得分:5)

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

int main()
{
    int i = (int j = 0);
    return 0;
}

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

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

答案 3 :(得分:1)

两个看起来都错了。

仅仅因为代码编译它并不意味着它是有效的。我很惊讶第一种情况是编译,因为似乎{else} i没有在其他情况下定义。

编辑:我在这里错了,if条件中的定义对整个if / else语句有效。