#include <stdio.h>

int main()
{
    int a=4,b=5,x=7;
    if(a=3)
        if (b=0)
            x=10;
    else
        x=0;
    printf("%d\n",x);
    printf("%d\n",b=a);
    return 0;
}

我目前正在学习 C,我知道=是用于给变量赋值,而==是用于比较;但是,我不太清楚=在语句中使用时代码是如何运行的if。在上面的代码中,我认为发生的事情是,在语句if运行时,首先赋值,然后进行比较,因此我不明白为什么打印 时会得到 0。x还是反过来?

4

  • 9
    你的else“属于”if (b=0)


    – 

  • 5
    最好使用{大括号}


    – 

  • 1
    在 C 语言中0false,其他任何语言都是true。没有“然后比较完成”。


    – 


  • 您能稍微扩展一下吗?“首先分配值,然后进行比较”您在代码中没有使用==。因此您应该告诉我们您指的是什么比较。


    – 


最佳答案
2

您的缩进具有误导性。使用正确的缩进,您的代码将如下所示:

#include <stdio.h>

int main()
{
    int a=4,b=5,x=7;
    if(a=3)
        if (b=0)
            x=10;
        else
            x=0;
    printf("%d\n",x);
    printf("%d\n",b=a);
    return 0;
}

这是因为一个else语句总是属于最近的if语句,除非你使用括号将其与不同的if语句关联起来,例如像这样:

#include <stdio.h>

int main()
{
    int a=4,b=5,x=7;
    if(a=3)
    {
        if (b=0)
        {
            x=10;
        }
    }
    else
    {
        x=0;
    }
    printf("%d\n",x);
    printf("%d\n",b=a);
    return 0;
}

误导性的缩进解释了为什么你的程序的输出x0而不是7

,大多数好的编译器都会警告您else在这种情况下使用没有明确括号的语句。例如,在编译器 GCC 和 Clang 上,如果您启用了以下警告,您将收到类似这样的警告-Wall-Wextra

<source>:9:9: warning: add explicit braces to avoid dangling else [-Wdangling-else]
    9 |         else
      |         ^

作为初学者,我建议您始终使用括号(即使不需要),以防止将来出现此类混淆。

在上面的代码中,我认为发生的情况是,当运行 if 语句时,首先分配值,然后进行比较 […]

这是正确的。

1

  • 我建议“作为一名C 程序员,我建议你总是使用括号(即使不需要)。”我曾经是代码风格阵营的一员,当只有一行时会跳过括号,但这种风格只会导致错误、错误和更多的错误。


    – 

在 C 语言中,赋值本身有一个值,该值实际上就是刚刚被赋的值。

例子:

printf("%d\n", a = 3);  // will print 3, and a will contain 3

所以这样:

if (a = 3)
   printf("Foo\n");

相当于这样:

a = 3;
if (a)
   printf("Foo\n");

因此if在这里是没有意义的,因为除 0 之外的任何东西都被视为真,因此上面的代码归结为:

a = 3;
printf("Foo\n");