没有大括号的嵌套 IF-Else 的工作

Working of Nested IF-Else Without the Braces

有人可以向我解释 没有 大括号的嵌套 If-Else 语句的工作原理。
我想了解为什么 Below Program 没有给我任何输出。
我已经检查了所有 4 种可能性。
(外部如果,内部如果)::(真,真),(真,假),(假,真),(假,假)。
我正在使用 CodeBlocks 进行编辑,在 Windows.

上使用 gcc 编译器
int main() 
{
  int n=0,m=0;
  if ( n > 0 )
       if ( m > 0 ) 
         printf("Inner-If Condition satisfied.");
  else 
     printf("Inner-If condition not satisfied. ");
  return 0;
}

谢谢。

它们的工作方式就好像 在下面的语句 周围有一个大括号。那么在你的情况下:

if ( n = 0 ){ // ToDo - did you mean `==`, `n = 0` is `0`.
    if ( m = 0 ){ // ToDo - ditto.
        printf("True");
    } else {
        printf("False");
    }
}

在你的情况下,我认为困惑源于你使用 = 而不是 ==

if-else 歧义通过定义解决,即歧义的 else 属于最近的 if。

解析器会发现歧义,但是,解析器已经按照上述方法(例如 yacc)进行了调整以解决歧义。

注意:您的程序没有给出任何输出的原因是因为 n=0(赋值)导致 n 为零,因此测试变为假,因此不采用分支并且 return 被执行。

在if语句中使用==。例如下面提到的代码将起作用。

if ( n == 0 )
   if ( m == 0 )
       printf("True");
   else printf("False");

n = 0 是 C 语言中的一个 赋值 。它将 n 赋值为 0。赋值也评估分配的值,所以在这里,0,它在布尔上下文 false 中 - 所以你的外部 if 总是假的。

比较两个值,请改用==,在相等时计算结果为1true),0 (false) 关于不平等。 *)

您关于 ifelse 的假设是正确的,您看不到输出的原因只是您在比较值时的错误尝试。

一个好的编译器会警告你这样的拼写错误。例如。使用 gcc,使用 -std=c11 -Wall -Wextra 启用一组合理的警告。


*) 作为旁注,在布尔上下文中,零值是 false 任何其他值 true,因此您可以也这样写代码(!逻辑not,反转真假):

if (!n)
    if (!m)
        // ...

这是否是好的风格取决于你问的是谁。如果 0 在语义上表示 缺少值 ,或者如果变量已经表示为布尔值,我个人喜欢这样写。然后 "if not n" 听起来很自然。