C#中的两个如果和一个其他。会发生什么?
例如:C#中的两个如果和一个其他。会发生什么?,c#,if-statement,C#,If Statement,例如: if(cond1) if(cond2) DoCond2(); else DoCond3(); else语句将被视为第一个if语句的else,还是第二个if语句的else?为什么?(有没有从句法角度的解释?) 答案在其他基于C的编程语言(如C和Java)中也是一样的吗 注意:这不是家庭作业。我可以很容易地测试它,如果我不喜欢默认行为,可以使用花括号,但我对原因很好奇 编辑伙计们,很明显,原始示例中有一个非常严重的错误。请再查一下。我知道,这很尴尬。对不起。根据 在嵌套的if语句中,els
if(cond1)
if(cond2) DoCond2();
else DoCond3();
else
语句将被视为第一个if
语句的else,还是第二个if
语句的else?为什么?(有没有从句法角度的解释?)
答案在其他基于C的编程语言(如C和Java)中也是一样的吗
注意:这不是家庭作业。我可以很容易地测试它,如果我不喜欢默认行为,可以使用花括号,但我对原因很好奇
编辑伙计们,很明显,原始示例中有一个非常严重的错误。请再查一下。我知道,这很尴尬。对不起。根据
在嵌套的if语句中,else子句属于没有相应else的last if
C和C++,条件可以被评估,其中0的结果是假的,任何其他的数都是真的。在C#中,条件的计算结果必须为布尔值true/false
编辑根据编辑,它是一个嵌套的if,因此当为true时,内部if将被计算,而else仍然与内部if一起计算。为了理解这一点,添加大括号将非常有用:
if(cond1) {
DoCond1();
}
if(cond2) {
DoCond2();
} else {
DoCond3();
}
如果If
或else
后没有大括号,则只有第一条语句(在本例中为DoCondX
)属于If/else块
编辑后查看代码:
if(cond1) {
if(cond2) {
DoCond2();
} else {
DoCond3();
}
}
else语句将被视为第一个if或第二个if的else吗
编辑(删除我原来在这里说的内容-不适用):
有这样的结构,我不能告诉你。每种语言的语法都不明确
但我个人认为,如果,它会“粘”到最近的。否则,人们几乎不可能阅读
我会说试试看,但最好的解决方案是应用一个禁止人们这样做的编码标准
为什么??(有没有从句法角度的解释?)
您可以查看每种语言的(通常是非正式的)语法定义,了解为什么这些语句会以这种方式连接在一起
(旧)官方C#文法:
编辑:但这对您没有多大帮助,因为在这种情况下,类C语言的语法需要上下文,或者经过深思熟虑的解决方法
见:
答案在其他基于C的编程语言(如C和Java)中也是一样的吗
语法是很复杂的事情,要正确使用嵌套的作用域有点困难。但一般来说,答案通常围绕块
s与语句
s的定义
您可以将语句定义为以结尾的行代码>。然后将块
定义为一系列语句
被{
}
包围
因此,您可以将if
语句定义为if块或语句[其他块或语句]
,表示它是可选的[
]
编辑:这个定义的问题是这样的语法需要上下文,并且只解决问题的原始表述。当它确实不明确时(作为新的编辑版本),您必须有更高级别的处理(上下文)来处理不明确
C++,例如:
if(cond1)
if(cond2) DoCond2();
else DoCond3();
- (从中抓取链接)
在最后一个文档中,您会多次看到“”。这特别描述了您要查找的内容
这个问题存在于许多语言中,而不仅仅是C语言。这是您在变体中看到诸如end if
或if
s的规则之类的显式语句的原因之一。让我们澄清一下if
语句是如何工作的
在if
子句之后,可以有两件事:
- 单行语句
- 多行语句
单行语句类似于您提供的两个示例。在该场景中,else
仅在紧跟在它之后时才属于if
(如第二个示例)
多行语句将在if语句后面有一个花括号{}
。结束括号后面的else
使其属于该语句
您可以使用else if
语法“链接”if
语句。以下if的行为类似于正常if,但仅当前面的if
返回false时,才会对其进行检查。在您的示例中,两个if
语句都将被检查,而不考虑结果。您可以自己在线测试:,仅供参考:这也被称为问题。始终添加大括号,您将永远不会感到疑惑。这绝对是其中一种构造,即使我知道约定,我也会使用大括号来增强可读性。这就是为什么我喜欢Python-强制缩进没有歧义!添加括号肯定会澄清结果。这里的括号与原始代码的作用完全相同。添加括号是我在某些代码不清楚时经常做的事情(有时仍然这样做):@Louis Rhys:根据更改的代码更新示例从技术上讲,else
是“直接在”两个if
s之后,因为两个if位于同一点。否。正如我所写的,单行语句是“单行”,意思是在第一个分号之后,语句就完成了,除非它后面紧跟着一个else。在您的例子中,后面跟着另一个if.Oops。很抱歉,我在示例中犯了一个严重的错误。把它改成了我的意思。在你编辑之后,我很尴尬,场景有点不同,但是else仍然保留在第二个if上,因为它是声明中“最接近的”。如果你在那之后再放一秒钟,那就属于外If了。是的,真的很抱歉。读了答案后才意识到我的错误。