有人可以向我解释一下没有卷曲大括号的嵌套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;
}
谢谢。
答案 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
总是为假。
要比较两个值,请使用==
代替1
(true
),0
({{1}关于不平等。 *)
您对false
和if
的假设是正确的,您没有看到输出的原因只是您错误地尝试比较值。
一个好的编译器会警告你这样的错别字。例如。使用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");