有人可以告诉我以下两个代码片段之间的区别:
//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”
答案 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
语句有效。