printf以“%d”为数字,以0开头(前“0102”)给出意想不到的答案(ex’“66”)

我在printf语句中使用了下面的代码。

void main() { int n=0102; printf("%d", n); } 

这打印66作为答案。 我还将变量n的值更改为012.它给出了答案10.请帮助我关于如何完成此转换?

这是因为当数字的第一个数字(整数常量)为0 (第二个数字不能是xX )时,编译器会将其解释为八进制数。 使用%d打印它将为您提供小数值。
要打印八进制值,您应该使用%o说明符

  printf("%o", n); 

6.4.4.1整数常量:

  1. 整数常量以数字开头,但没有句点或指数部分。 它可能有一个指定其基数的前缀和一个指定其类型的后缀。

  2. 十进制常量以非零数字开头,由一系列十进制数字组成。 八进制常量由前缀0组成,可选地后跟一个数字0到7的序列 。 hex常量由前缀0x或0X后跟一个十进制数字序列和字母a(或A)到f(或F)分别由值10到15组成。


整数常量:

1. 十进制常量不能0开头。

  12 125 3546 

2. 八进制常量 :必须以0开头。

  012 0125 03546 

3. hex常量 :始终以0x0X 0x

  0xf 0xff 0X5fff 

您告诉printf打印十进制值(%d)。 使用%o以八进制打印。

任何以0开头,后跟数字的数字文字都被视为八进制数。 于是

 0102 = (1 * 8^2) + (0 * 8^1) + (2 * 8^0) = 64 + 0 + 2 = 66 012 = (1 * 8^1) + (2 * 8^0) = 8 + 2 = 10