C 如果没有括号,如何处理if和else?
为什么我在运行此操作时没有看到任何显示?我希望能打印出C 如果没有括号,如何处理if和else?,c,if-statement,C,If Statement,为什么我在运行此操作时没有看到任何显示?我希望能打印出EINVAL,而不是什么都不打印 #include <stdio.h> unsigned int set_request(int val) { printf("set_request entry\n"); return 0; } void main() { unsigned int val = 2; if (val == 0 || val == 1) if (set_requ
EINVAL
,而不是什么都不打印
#include <stdio.h>
unsigned int set_request(int val)
{
printf("set_request entry\n");
return 0;
}
void main()
{
unsigned int val = 2;
if (val == 0 || val == 1)
if (set_request(val))
printf("EIO\n");
else
printf("EINVAL\n");
}
当我添加{}
时,我得到了正确的行为,但是我想知道没有{}
的if
的行为
或者,如果我将赋值行修改为0,如下所示,那么我会看到其他奇怪的东西。现在我不希望打印出EINVAL
#include <stdio.h>
unsigned int set_request(int val)
{
printf("set_request entry\n");
return 0;
}
void main()
{
unsigned int val = 0;
if (val == 0 || val == 1)
if (set_request(val))
printf("EIO\n");
else
printf("EINVAL\n");
}
else
将绑定到最里面的if
。因此:
if (val == 0 || val == 1)
if (set_request(val))
printf("EIO\n");
else
printf("EINVAL\n");
实际上与:
if (val == 0 || val == 1) {
if (set_request(val)) {
printf("EIO\n");
} else {
printf("EINVAL\n");
}
}
需要大括号来正确绑定
else
子句。因此,最好总是将它们与if
..else
一起使用,以避免混淆。您的代码如下所示
if (val == 0 || val == 1)
if (set_request(val))
printf("EIO\n");
else
printf("EINVAL\n");
if (val == 0 || val == 1)
{
if (set_request(val))
printf("EIO\n");
else
printf("EINVAL\n");
}
现在,缩进对编译器并不重要,所以它会像这样放置大括号
if (val == 0 || val == 1)
if (set_request(val))
printf("EIO\n");
else
printf("EINVAL\n");
if (val == 0 || val == 1)
{
if (set_request(val))
printf("EIO\n");
else
printf("EINVAL\n");
}
因此,else与第一个if不匹配,而是与第二个if匹配
看起来你真的想要这样的东西
if (val == 0 || val == 1)
{
if (set_request(val))
printf("EIO\n");
}
else
printf("EINVAL\n");
在这种情况下,需要指定大括号。请注意,为了避免这种歧义,最好始终使用大括号明确表示
此外,如果在启用“警告”的情况下编译,编译器将对代码段发出警告。[-Wdangling else]将
else
与前面最近的if
语句匹配。这种情况有一个名字,那就是。编译器实际上会将您的代码视为:
void main()
{
unsigned int val = 0;
if (val == 0 || val == 1)
if (set_request(val))
printf("EIO\n");
else
printf("EINVAL\n");
}
这就是为什么你必须用花括号来表达你的意图。如果希望将else
绑定到外部If
可以将代码编写为:
void main()
{
unsigned int val = 0;
if (val == 0 || val == 1) {
if (set_request(val))
printf("EIO\n");
} else
printf("EINVAL\n");
}
缩进没关系。C++不是Python,请阅读TL;Dr:Cux.ValueMeNe()/Cuth>是坏的,你应该使用
void main()
显然是错误的。这是一个众所周知的语法歧义,大多数语言(包括C)通过将else
绑定到最接近的if
来解决。这个问题至少可以追溯到Algol60。这个问题的计算机科学术语是。@PaulOgilvie,它显示出了等价性。第一个代码块相当于第二个代码块。另请参见“当我添加{}
时,我得到了正确的行为,但我想知道问题中没有{}
的if的行为”。