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>是坏的,你应该使用 .S.S.ANE,甚至更好(在C++中)<代码> int main()/<代码> <代码> Value>代码>,一个空的参数列表是C-ISM——C++中不需要的。但是是的,
void main()
显然是错误的。这是一个众所周知的语法歧义,大多数语言(包括C)通过将
else
绑定到最接近的
if
来解决。这个问题至少可以追溯到Algol60。这个问题的计算机科学术语是。@PaulOgilvie,它显示出了等价性。第一个代码块相当于第二个代码块。另请参见“当我添加
{}
时,我得到了正确的行为,但我想知道问题中没有
{}
的if的行为”。