我想知道为什么我不能在下面的表达式中声明变量。
menu.add label: I18n.t('active_admin.menu.import'), url: '/admin/import', if: proc{ current_user.admin? } #or use any cancan magic.
虽然我们可以在for语句中声明一个变量。
答案 0 :(得分:5)
在C ++中,声明只允许在声明语句中以及控制结构if
,while
和for
内。
由于声明的目的是引入一个名称,因此只有在名称可见的包含范围内,声明才有意义,并且这些选项是唯一合理的选项。声明语句将名称引入周围的范围,并且三个控制结构各自包含各自的声明引入名称的内部范围。
答案 1 :(得分:3)
这只是如何定义C ++语法的问题。您不能将语句放在表达式中,并且声明变量是一个decl语句。 for循环将decl语句作为其初始化程序,因此可以在那里声明变量。
理论上你可以使用你编写的代码可以使用的语法。但它可能会令人费解。声明变量的范围是什么?并且程序员需要深入了解表达式,以查看变量是否未在某处秘密声明。
答案 2 :(得分:1)
我认为它可能对应于这样的事实:在C ++规范中,像int var = val
这样的声明/初始化语句是一段基本上等同于另外两个的代码:int var
这是语句和var = 5
表达式,并为具有指定值的变量提供一块内存。所以,基本上你要做的就是将没有返回值的语句与数字进行比较。
为了说明它,最好尝试运行以下代码:
int main(){
int i;
if ((i = 100) > 60){
std::cout << "It worked!";
}
return 0;
}
您将看到此代码已编译,因为现在您比较返回值和数字的表达式i = 100
。