【问题标题】:Working of Nested IF-Else Without the Braces没有大括号的嵌套 IF-Else 的工作
【发布时间】:2018-04-30 11:08:18
【问题描述】:

谁能解释一下嵌套If-Else语句的工作原理没有花括号。
我想了解为什么“下面的程序”没有给我任何输出。
我已经检查了所有 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 属于哪个else。 c 编译器不考虑缩进。
  • n = 0 是一个assignment,并且总是计算false。因此,使用 exactly 这段代码,您将永远不会看到 any 输出。
  • 您正在为n 分配m 的值0,在if 语句中等于false。
  • 在这种情况下,您可能应该使用大括号,因为您的代码的读者可能不清楚其意图是什么。
  • @WeatherVane 属于内层

标签: c if-statement conditional


【解决方案1】:

他们工作好像下面的语句有一个花括号。那么在你的情况下:

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

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

【讨论】:

    【解决方案2】:

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

    解析器会看到歧义,但是,解析器已经适应于解决上述歧义(例如 yacc)。

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

    【讨论】:

    • 已更新。这是一种很好的表达方式。请随意提及=== 问题。
    【解决方案3】:

    n = 0 是 C 中的 赋值。它将 n 赋值为 0。赋值也会计算分配的值,所以这里是 0,它在布尔上下文 false 中——所以你的外部 if 总是 false。

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

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

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


    *) 作为旁注,在布尔上下文中,零值是 false任何其他值true,所以你也可以编写这样的代码 (@987654338 @是逻辑not,真假颠倒):

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

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

      • @BcK 有不同的语义——如果n != 0,它会打印一些东西。
      • @FelixPalmen 我的错误道歉,printf((n == 0) ? (m == 0 ? "True" : "False") : ""); 这是正确的版本,但我想,它的可读性较差。
      猜你喜欢
      • 2013-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多