C中的else…if语句等于else{if}吗?

C中的else…if语句等于else{if}吗?,c,if-statement,C,If Statement,我的问题: 这是: if(…){ }否则如果(…){ } 等于这个吗 if (...) { } else { if (...) { } } 事实上,我猜在这两种情况下,结果是相同的,但如果在C中有一个不同的语句 if (...) { } else if (...) { } 与 if (...) { } else { if (...) { } } 但是 不同于 if (...) { } else { ... // e

我的问题:

这是:

if(…){
}否则如果(…){
}
等于这个吗

if (...) {
  
} else {
  if (...) {
    
  }
}
事实上,我猜在这两种情况下,结果是相同的,但如果在C中有一个不同的语句

if (...) {
  
} else if (...) {
  
}

if (...) {
  
} else {
  if (...) {
    
  }
}

但是

不同于

if (...) {
  
} else {
   ... // extra statements
  if (...) {
    
  }
}

C语言没有名为
的功能,如果
,则称为else。只有通过编码风格才能获得。您的示例100%等同于此:

if (...) {
  
} 
else 
  if (...) {
  
  }

如果第二个
if
else
下面的一条语句,那么我们可以在不使用
{}
的情况下编写它来处理建议绘制真值表的注释,逻辑上等价的程序在生成的程序集方面并不总是相同的(它们的行为将相同),但要考虑:

int main()
{ 
    int a = 1;
    if (a)
       if(a)
          return 0;
}

无优化编译
-O0

main:
        push    rbp
        mov     rbp, rsp
        mov     DWORD PTR [rbp-4], 1
        cmp     DWORD PTR [rbp-4], 0
        je      .L2
        cmp     DWORD PTR [rbp-4], 0
        je      .L2
        mov     eax, 0
        jmp     .L3
.L2:
        mov     eax, 0
.L3:
        pop     rbp
        ret


他们几乎是同一件事

它们与编译器对待它们的方式完全相同

然而,就发展目的而言,它们并不相同。如果在所附的
If
语句结束后立即插入了其他代码,则它将与代码中的该语句分组,并在该
If
语句周围用大括号括起来,但不在没有大括号的代码中。像这样的问题是导致bug的潜在原因,因此差异可能很大。

如果您编写

    if(...){
    } else{ 
        if(...){ ... }
    }
这与

if (...) {
  
} else if (...) {
  
}
只要将
else
语句保持为空,第二条if语句除外


else如果
在技术上不是它自己的语句。else-if字面上是一个else语句,然后是一个if语句。

完全一样。这是正确的。如果是它自己的实体,C就不会真正识别出
else。它只是将其视为一个
else
,其语句恰好是另一个
if
。好的!那真是太快了。谢谢:)我喜欢画真相表来理解这些场景。为两个条件(四个排列)绘制真值表,并写入执行的代码块。然后比较这两个场景的结果。如果您使用更具可读性的缩进样式,它将变得更加明显。正因为如此,我们可以用
来娱乐自己,或者:If
和类似的重要构造:)好答案唯一的例外是比较优化
main:
        push    rbp
        mov     rbp, rsp
        mov     DWORD PTR [rbp-4], 1
        cmp     DWORD PTR [rbp-4], 0
        je      .L2
        mov     eax, 0
        jmp     .L3
.L2:
        mov     eax, 0
.L3:
        pop     rbp
        ret
    if(...){
    } else{ 
        if(...){ ... }
    }
if (...) {
  
} else if (...) {
  
}