说服同事,如果他们没有嵌套的话
Convincing a colleague about their if not being nested
我的一位大学同事今年开始编程,有时会写这样的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();
缩进的if和else形成选择语句,即出现在前一选项语句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();
}
额外的大括号封装了一条语句当if
或else
控件一句话。(我的第一个例子把放在每个语句中除了括号中包含的CCD_ 6。)
从逻辑上讲,程序员倾向于按照第二其中某种支撑({}
,BEGIN
/END
或缩进)几乎总是添加CCD_ 10或CCD_。C和C++(以及Java、C#和…)没有,因为表单在没有额外关键字的情况下工作。
最后,您不需要额外的缩进。(我有箱子具有十五个或二十个连续的CCD_ 12。这会使对于一些严重的压痕。)另一方面,您确实想要单独一行上的受控语句。(支撑是可选:如果您的编码标准将大括号放在单独的行,如果它只包含一句话。)
- 嵌套在类中时无法设置成员数据
- 无法访问嵌套类.类的使用无效
- 我正在使用嵌套的while循环来解析具有多行的文本文件,但由于某种原因,它只通过第一行,我不知道为什么
- 如何在C++中初始化嵌套类中的2个memeber
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- 在C++中搜索嵌套多映射值
- 在C++中将矢量转换为嵌套地图
- C++嵌套if语句,基本货币交换
- 在nlohmann json中,如何将嵌套对象的数组转换为嵌套结构的向量
- 嵌套的匿名命名空间
- 了解嵌套循环打印星号图案
- 如何使用boost::具有嵌套结构和最小代码更改的序列化
- 嵌套for循环C++的问题(初学者)
- 从嵌套在std::映射中的std::列表中删除元素的最佳方式
- 用C#中的并集模拟C++嵌套结构
- 部分专业化和嵌套模板
- 嵌套While循环不起作用(C++问题)
- C++-模板嵌套类的引用初始化无效
- 如何在嵌套类中正确使用友元声明?
- 说服同事,如果他们没有嵌套的话