这是允许的:
// scope_1
int i = 100;
if (i > 50)
{
// scope_2
int a = 200;
}
Run Code Online (Sandbox Code Playgroud)
这给出了错误:
// scope_1
if (100 > 50)
int a = 200;
Run Code Online (Sandbox Code Playgroud)
第二个代码示例的原因是否由于范围而导致错误?因此编译器不允许可变一个只有当条件语句评估为真,因为如果它确实允许的话,那就没有办法编译器弄清楚是否允许另一个名为变量的声明中声明内特定范围一个 scope_1内?
sta*_*ica 13
if (100 > 50)
int a = 200;
Run Code Online (Sandbox Code Playgroud)
你为什么想做这个?在声明为变量的单语句范围内声明变量似乎没有意义,因为您实际上没有时间使用声明的变量.
如果允许您a在if语句外引用,则上述操作将导致条件变量声明.但是,声明不能是有条件的.编译器在遇到可以声明或未声明的标识符时可以合理地做些什么?无论哪种情况都只能在运行时计算出来,而不是在编译时; 但是编译器需要知道(因为未声明的标识符是语法错误),因此它会抱怨这个构造.
您没有在if语句中使用括号,因此此后只允许使用一个语句.如果变量无法被引用,那么对变量进行尺寸标注的重点是什么?
此外,您的第二个if语句使用文字常量,显然永远不会是真的.再说一次,将任何内容放入其中是什么意思?
也许我误解了你的问题.
让我稍微改一下你的问题吧.
规范的哪个部分定义了这种行为?
第8.7.1节声明"if"的陈述是"嵌入式陈述".
第8节的开头指出嵌入语句可以是块或空,表达式,选择,迭代,跳转,尝试,检查,取消选中,锁定,使用或屈服语句,但不是标记语句或声明语句.
为什么不允许声明?
原始语言注释没有解决这个问题,但我们可以做一些有根据的猜测.你的猜想很好; 这样做会使得很难推断所声明的本地范围.如果我们允许它,那么我们必须决定"if"是否隐式地创建一个局部变量声明范围,即使没有块:
if (x) int y = M();
else string y = N();
Run Code Online (Sandbox Code Playgroud)
这是重新声明的局部变量错误吗?或条件的每个分支是否产生自己的局部变量声明空间?
那这个呢?
if(x) int y = M();
else y = N();
Q(y);
Run Code Online (Sandbox Code Playgroud)
是否在范围之外?如果是这样,它是否在到达Q(y)时被明确分配?
我对这里正确的事情没有强烈的直觉.无论我们选择哪一个,似乎有一半的人会认为我们选错了.如果你想引入一个新的局部变量声明空间,那么更好地使整个认为非法并需要括号.
现在有些问题你没问过:
切换块怎么样?是否适用相同的规则?
不,请阅读:
http://ericlippert.com/2009/08/13/four-switch-oddities/
如果我合法地声明一个局部变量但只分配给它,会发生什么情况,如在我的例子中,条件的结果中的块?
有时候会收到警告.有时候你没有.
编译器如何决定是否发出警告?
读这个:
| 归档时间: |
|
| 查看次数: |
3324 次 |
| 最近记录: |