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

时间:2018-04-30 11:08:19

标签: c if-statement conditional

有人可以向我解释一下没有卷曲大括号的嵌套If-Else语句的工作情况。
我想了解为什么以下程序不能给我任何输出 我检查了所有4种可能性 (Outer-If,Inner-If)::( True,True),(True,False),(False,True),(False,False)。
我正在使用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;
}

谢谢。

4 个答案:

答案 0 :(得分:7)

他们的工作 as-if 在以下语句周围有一个大括号。在你的情况下:

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

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

答案 1 :(得分:3)

if-else模糊性由定义解决,其中一个模糊的其他属于最近的if。

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

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

答案 2 :(得分:2)

n = 0是C中的作业。它会为n分配值0。赋值也会计算分配的值,所以这里是0,它位于布尔上下文false中 - 所以外部if总是为假。

比较两个值,请使用==代替1true),0({{1}关于不平等。 *)

您对falseif的假设是正确的,您没有看到输出的原因只是您错误地尝试比较值。

一个好的编译器会警告你这样的错别字。例如。使用else,使用gcc启用一组合理的警告。

*)作为旁注,在布尔上下文中,零值为-std=c11 -Wall -Wextra任何其他值false,因此您也可以编写代码这个(true是逻辑!,反转真和假):

not

这种风格是否合适取决于你的要求。如果if (!n) if (!m) // ... 在语义上表示缺少值,或者该变量已经作为布尔值,我个人喜欢这样写。那么“if not n”听起来很自然。

答案 3 :(得分:1)

使用== inside if Statement。如下面提到的代码将起作用。

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