让一位同事相信他们是否没有被嵌套

Vit*_*meo 7 c c++ if-statement nested

今年开始编程的我的一位大学同事有时写下这样的陈述:

if(something) doA();
else
    if(something2) doC();
    else doD();
Run Code Online (Sandbox Code Playgroud)

他被认为第二if-else对被视为单个实体,并且它实际上嵌套在第一对之下else.

但是,我确信他的代码相当于:

if(something) doA();
else if(something2) doC();
else doD();
Run Code Online (Sandbox Code Playgroud)

这表明第二个else实际上并不是嵌套的,而是与第一个if相同的级别.我告诉他,他需要用花括号来达到他想要的效果.

"但我的代码按预期工作!"

事实上,它按预期工作.事实证明代码的行为是相同的,即使else没有嵌套.

令人惊讶的是,我发现自己无法写出一个清晰简洁的例子,显示出不同的行为

if(something) doA();
else
    if(something2) doC();
    else doD();
Run Code Online (Sandbox Code Playgroud)

和

if(something) doA();
else {
    if(something2) doC();
    else doD();
}
Run Code Online (Sandbox Code Playgroud)

你能帮我找一个例子,告诉我的同事使用/不使用花括号之间的区别吗?

或者,就行为而言,看起来不正确的版本总是等同于花括号的版本?

Eri*_*hil 11

根据C 2011 6.8.4 1,选择语句的语法包括此产品:

selection-statement:if ( 表达式 ) 语句 else 语句

按6.8 1,声明的制作是:

声明:选择声明

因此,在:

if(something) doA();
else
    if(something2) doC();
    else doD();
Run Code Online (Sandbox Code Playgroud)

缩进如果和别人形成一个选择语句即是声明出现的在别人前面的子句的选择语句.

我展示的作品表明这是C语法中可能的解释.为了看到它是唯一的解释,我们观察到初始selection-statement的else子句中的文本必须是一个语句,因为C语法中没有其他生成else关键字的生成.(通过搜索A.2中的语法最容易看出.由于它的大小,我不会在这里重现它.)所以我们知道else后跟一个语句.我们可以很容易地看到该语句是一个选择语句,因为它以if开头.然后剩下的唯一的问题是,是否在未来还有就是一部分,如果语句或没有.根据6.8.4.1 3," 如果语法允许,则else与词汇最接近的前缀相关联."

  • @VittorioRomeo嗯,他是,他不是.他的缩进确实反映了编译器如何看待事物,而不是人类如何理解它们.他的缩进是糟糕的编程习惯. (2认同)

Jam*_*nze 5

两种结构都是相同的.编译器有效地将代码视为:

if ( something ) {
    doA()
} else {
    if ( something2 ) {
        doC();
    } else {
        doD();
    }
}
Run Code Online (Sandbox Code Playgroud)

然而,在实践中,这与之间没有区别:

if ( something ) {
    doA();
} else if ( something2 ) {
    doC();
} else {
    doD();
}
Run Code Online (Sandbox Code Playgroud)

额外的括号封装单个语句,你实际上并不需要括号时if或else控制一个语句.(我的第一个例子是除括号括起来之外的所有陈述if.)

从逻辑上讲,程序员倾向于按照第二种方式行事; 其中某种支撑(语言{}, BEGIN/ END需要或缺口)几乎总是添加 elsif或elif以允许该第二格式的关键字.C和C++(以及Java和C#,以及......)没有,因为第二种形式没有额外的关键字.

最后,您不需要额外的缩进.(我的情况是连续十五或二十次else if.这会造成一些严重的缩进.)另一方面,你确实希望控制语句在一个单独的行上.(支撑是可选的:如果你的编码标准将括号放在一个单独的行上,如果它只包含一个语句,它也是常规的来抑制它.)