说服同事,如果他们没有嵌套的话

Convincing a colleague about their if not being nested

本文关键字:嵌套 他们 如果      更新时间:2023-10-16

我的一位大学同事今年开始编程,有时会写这样的if语句:

if(something) doA();
else
if(something2) doC();
else doD();

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

然而,我确信他的代码相当于:

if(something) doA();
else if(something2) doC();
else doD();

这表明第二个else实际上并不是嵌套的,而是与第一个if在同一级别上。我告诉他,他需要使用花括号来实现他想要的。

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

事实上,它按预期发挥了作用。事实证明,即使else没有嵌套,代码的行为也是一样的。

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

if(something) doA();
else
if(something2) doC();
else doD();

if(something) doA();
else {
if(something2) doC();
else doD();
}

你能帮我找一个例子向我的同事展示使用/不使用大括号的区别吗?

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

根据C 2011 6.8.4 1,选择语句的语法包括以下生成:

选择语句if(表达式语句其他语句

根据6.81,语句的生成为:

语句选择语句

因此,在:

if(something) doA();
else
if(something2) doC();
else doD();

缩进的ifelse形成选择语句,即出现在前一选项语句others子句中的语句。

我展示的结果表明,这是C语法中一种可能的解释。为了证明这是唯一的解释,我们观察到初始选择语句else子句中的文本必须是语句thers关键字。(通过搜索第A.2条中的语法最容易看出这一点。由于它的大小,我不会在这里复制它。)所以我们知道else后面跟一个语句。我们可以很容易地看到,该语句是一个选择语句,因为它以if开头。那么剩下的唯一问题是下一个else是否是if语句的一部分。根据6.8.4.1 3,"如果语法允许,则else与词汇上最接近的前一个相关联。">

这两种结构产生的结果是相同的。编译器有效地将代码视为:

if ( something ) {
doA()
} else {
if ( something2 ) {
doC();
} else {
doD();
}
}

然而,在实践中,这与没有什么不同

if ( something ) {
doA();
} else if ( something2 ) {
doC();
} else {
doD();
}

额外的大括号封装了一条语句当ifelse控件一句话。(我的第一个例子把放在每个语句中除了括号中包含的CCD_ 6。)

从逻辑上讲,程序员倾向于按照第二其中某种支撑({}BEGIN/END或缩进)几乎总是添加CCD_ 10或CCD_。C和C++(以及Java、C#和…)没有,因为表单在没有额外关键字的情况下工作。

最后,您不需要额外的缩进。(我有箱子具有十五个或二十个连续的CCD_ 12。这会使对于一些严重的压痕。)另一方面,您确实想要单独一行上的受控语句。(支撑是可选:如果您的编码标准将大括号放在单独的行,如果它只包含一句话。)