为什么 C 编程会给出不同的输出?

MKS*_*MKS -1 c output

我得到了意想不到的输出,我无法弄清楚原因。

    #include <stdio.h>

    int main() {
        int a = 0100;
        int b = 010;
        int c = 1111;
        int d = 01111;
        printf("0100 => %d, 010 => %d, 1111 => %d, 01111=> %d\n", a, b, c, d);
   }
Run Code Online (Sandbox Code Playgroud)

输出:

0100 => 64, 010 => 8, 1111 => 1111, 01111=> 585 
Run Code Online (Sandbox Code Playgroud)

为什么会出现这样的输出?

Cin*_*lue 5

在 C 中,将任一0x或放在0整数文字值之前将导致编译器分别解释以 16 进制(十六进制)和以 8 进制(八进制)表示的数字。

通常,我们解释和读取基数为 10(十进制)的数字。但是,我们有时会使用这些其他基数,因为它们是有用的 2 的幂,可以表示位组(1 个十六进制数字 = 4 位,1 个八进制数字 = 3 位),并且位操作是 C 想要提供的。这就是为什么您会看到诸如char用 2 个十六进制数字(例如0x12)来表示将单个设置char为特定位序列的原因。

如果您想验证这一点,printf还允许您分别int使用%x%o代替以十六进制和八进制输出%d

#include <stdio.h>
int main()
{
    int a = 0100;
    int b = 010;
    int c = 1111;
    int d = 01111;
    printf("0100 => %o, 010 => %o, 1111 => %d, 01111=> %o\n", a,b,c,d);
}
Run Code Online (Sandbox Code Playgroud)

如果你运行这个程序,你会得到以下信息:

#include <stdio.h>
int main()
{
    int a = 0100;
    int b = 010;
    int c = 1111;
    int d = 01111;
    printf("0100 => %o, 010 => %o, 1111 => %d, 01111=> %o\n", a,b,c,d);
}
Run Code Online (Sandbox Code Playgroud)

...这正是您在程序中设置的值,只是没有前缀。您只是在原始代码中意外地在赋值时错误地使用了另一种整数编码,并使用了不同的一种来输出值。