Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#中的两个如果和一个其他。会发生什么?_C#_If Statement - Fatal编程技术网

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了。是的,真的很抱歉。读了答案后才意识到我的错误。