C程序自动八进制解释

C程序自动八进制解释,c,C,代码1: 代码2: int a = 0987654321; printf("%d",a); 在这里,如果我们输入0987654321,那么它将打印相同的内容,但在第一个代码段中,它给出了一个错误,即八进制常量中的无效值9。使用C编写代码时,可以使用多种表示法- 十六进制(0x123A) 二进制(0b1011)——标准C不支持,但它是像gcc这样的编译器提供的扩展 八进制(01237) 十进制(1234)——可能是最常见的 这里使用的是八进制表示法(因为它以0开头)。这意味着每个数字都以8为

代码1:

代码2:

int a = 0987654321;
printf("%d",a);

在这里,如果我们输入0987654321,那么它将打印相同的内容,但在第一个代码段中,它给出了一个错误,即八进制常量中的无效值9。

使用C编写代码时,可以使用多种表示法-

  • 十六进制
    (0x123A)
  • 二进制
    (0b1011)
    ——标准C不支持,但它是像
    gcc
    这样的编译器提供的扩展
  • 八进制
    (01237)
  • 十进制
    (1234)
    ——可能是最常见的
这里使用的是八进制表示法(因为它以
0
开头)。这意味着每个数字都以8为基数。因此,
0
后面的每个数字只能在
[0-7]
范围内<代码>9不是有效的八进制数字,因此编译器正在抱怨

如果您想实际使用十进制表示法,可以将
0
删除为-

int a;
scanf("%d",&a);
printf("%d",a);

在第二个示例中,它实际上可以正常工作,因为
scanf
%d
始终作为十进制表示进行扫描,
9
是有效的十进制数字

使用C编写代码时,可以使用多种表示形式-

  • 十六进制
    (0x123A)
  • 二进制
    (0b1011)
    ——标准C不支持,但它是像
    gcc
    这样的编译器提供的扩展
  • 八进制
    (01237)
  • 十进制
    (1234)
    ——可能是最常见的
这里使用的是八进制表示法(因为它以
0
开头)。这意味着每个数字都以8为基数。因此,
0
后面的每个数字只能在
[0-7]
范围内<代码>9不是有效的八进制数字,因此编译器正在抱怨

如果您想实际使用十进制表示法,可以将
0
删除为-

int a;
scanf("%d",&a);
printf("%d",a);

在第二个示例中,它实际上可以正常工作,因为
scanf
%d
始终作为十进制表示进行扫描,
9
是有效的十进制数字

在scanf中,
%d
表示读取基数10。使用
%i
将前导零视为八进制说明符。不要忘记检查scanf的返回值注意,使用
%i
,输入
0987654321
将返回
0
,将
9
保留在输入缓冲区中,供下一次输入操作解释。在scanf中,
%d
表示读取基数10。使用
%i
将前导零视为八进制说明符。别忘了检查scanfNote的返回值,使用
%i
,输入
0987654321
将返回
0
,将
9
保留在输入缓冲区中供下一次输入操作解释。@BLUEPIXY让我检查一下标准,请稍候。尝试
gcc test.c-std=c11-pedantic
@BLUEPIXY yes,你确实是。在我的答案中,我会在二进制旁边加一个注释。感谢注意C++ 14向C++语言中添加二进制常量。它还允许您向带有
字符的数字添加分组:
0b0010'0011'1101'1010
是C++14中的有效二进制常量。标点符号使得C++14或更高版本的特别解析比引号被允许之前复杂得多。@JonathanLeffler我永远无法完全理解C++(14+)标准!谢谢你。但是,因为这是关于C++的问题,而且问题被标记为C,所以我不会回答这个问题。@BLUEPIXY让我检查一下标准,请稍等。试试
gcc test.C-std=c11-pedantic
@BLUEPIXY是的,你确实是。在我的答案中,我会在二进制旁边加一个注释。感谢注意C++ 14向C++语言中添加二进制常量。它还允许您向带有
字符的数字添加分组:
0b0010'0011'1101'1010
是C++14中的有效二进制常量。标点符号使得C++14或更高版本的特别解析比引号被允许之前复杂得多。@JonathanLeffler我永远无法完全理解C++(14+)标准!谢谢你。但是,因为它是关于
C++
的,而且这个问题被标记为
C
,所以我将把它排除在答案之外。