不明确的if和else分支:是否定义了行为?

wor*_*rty 6 c c++

我最近遇到了一些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)

是正确的.

  • +1但作为一个注释(对于OP),许多人认为良好的写作风格始终总是为这个(和其他)原因提出支持.不是编译模糊(不存在),而是人类模糊和愚蠢. (10认同)

ser*_*gio 5

没有任何歧义。该else子句总是指if它可以附加的最接近的子句。来自C++ 标准(6.4 选择语句):

在第 6 节中,术语“子语句”指的是语法符号中出现的包含语句或语句。选择语句中的子语句(每个子语句,以 if 语句的 else 形式)隐式定义了局部范围 (3.3)。

如果选择语句中的子语句是单个语句而不是复合语句,则就好像它被重写为包含原始子语句的复合语句一样。[ 例子:

   if (x) int i;
Run Code Online (Sandbox Code Playgroud)

可以等效地重写为

     if (x) { 
           int i;
     }
Run Code Online (Sandbox Code Playgroud)

因此,您编写的代码可以重写为:

if(test_1)
{
    if(test_2)
    {
        // Do stuff
    }
    else
    {
        exit(0);
    }
}
Run Code Online (Sandbox Code Playgroud)