我最近遇到了一些C++代码,如下所示:
if(test_1)
if(test_2)
{
// Do stuff
}
else
exit(0);
Run Code Online (Sandbox Code Playgroud)
这是不明确的,因为编译器可以将其视为:
if(test_1)
{
if(test_2)
{
}
else
{
}
}
Run Code Online (Sandbox Code Playgroud)
或作为:
if(test_1)
{
if(test_2)
{
}
}
else
{
}
Run Code Online (Sandbox Code Playgroud)
是否根据任何标准(C,C++)定义了此代码的行为?我在VC++的C++程序中看到了这段代码,它似乎更喜欢第一个解决方案.
jpa*_*cek 12
是否根据任何标准(C,C++)定义了此代码的行为?
是的,它是定义的.在C(以及我所知道的所有类似语言)中,"悬空其他"与最后一个免费绑定,因此,这种解释
if(test_1)
{
if(test_2)
{
}
else
{
}
}
Run Code Online (Sandbox Code Playgroud)
是正确的.
没有任何歧义。该else子句总是指if它可以附加的最接近的子句。来自C++ 标准(6.4 选择语句):
在第 6 节中,术语“子语句”指的是语法符号中出现的包含语句或语句。选择语句中的子语句(每个子语句,以 if 语句的 else 形式)隐式定义了局部范围 (3.3)。
如果选择语句中的子语句是单个语句而不是复合语句,则就好像它被重写为包含原始子语句的复合语句一样。[ 例子:
Run Code Online (Sandbox Code Playgroud)if (x) int i;可以等效地重写为
Run Code Online (Sandbox Code Playgroud)if (x) { int i; }
因此,您编写的代码可以重写为:
if(test_1)
{
if(test_2)
{
// Do stuff
}
else
{
exit(0);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1386 次 |
| 最近记录: |