有人可以告诉我以下两个代码片段之间的区别:
//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)
这是第二个代码段错误的另一种变体:
int main()
{
int i = (int j = 0);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
您不能在ANY表达式中声明变量.Second()里面的for是相同的情况 - 你可以在()内部声明变量i,但不能在放入()的嵌套表达式中声明.
希望我用恰当的语言解释它,也许更正确的解释存在.实际上两个代码片段都是奇怪的.