int a=020的奇怪输出 是16

int a=020的奇怪输出 是16

一个朋友问了我这样一个问题:为什么a的输出结果是16?int a=020的奇怪输出 是16_第1张图片

#include
int main()
{
	int a,b,c;
	a=020;
	b=0*20;
	c=20;
	printf("a=%d,b=%d,c=%d\n",a,b,c);
	
}
在这里插入代码片

我要求对方改变a的值为20的时候,输出又是正常的20,这让我有些奇怪,于是对她说我不知道。

这几天在网络上到处乱逛,倒是看到了这个知识点。
首先,当我们定义一个数字的时候,int a=020,实际上是定义了一个八进制的数字20,当使用%d输出的时候,实际上是按照十进制的模式输出八进制的数字20,计算机会自动地将八进制的20转化为十进制的16,这就是为什么int a=20的时候,用%d输出是20;而用int a=020的时候,输出的是16的缘故。

在c语言中,有十进制,八进制和十六进制可以定义,十进制不用任何特别地表示就是一个十进制的数字,例如int a=11,用%d输出的就是一个十进制的11,八进制则需要在数字前面添加一个0,用八进制来表示十进制的11,则需要int a=013;十六进制同理,但是十六进制的0变成了
输入0x,例如十进制的十七,用十六进制表达起来就是int a=11;

前一段时间我在处理文本输入输出的时候,为了数字的对齐,经常会使用%02d这种格式输出数字,这个的问题在于,当我使用一个读取文本的时候,数字会被识别为十六进制吗?
结果测试,能力有限,我只能使用如下代码获取文本中的数据,文本数据如下:

01 01
1 1
01 1
22 022

代码如下:

#include 
#include 
#define MAX_LINE 1024

int main()
{
	char buf1[10][100];
 char buf[MAX_LINE];  /*缓冲区*/
 FILE *fp;            /*文件指针*/
 int len;             /*行字符个数*/
   char delims[] = " ";  

 if((fp = fopen("data.txt","r")) == NULL)
 {
 perror("fail to read");
 exit (1) ;
 }
 while(fgets(buf,MAX_LINE,fp) != NULL)
 {
 	sscanf(buf, "%d %d", buf1[1],buf1[2]);
 	printf("%d  %d  \n  ",buf1[1],buf1[2]);
 }
  return 0;
}

使用这个格式读取
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210218195121502.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ5NzU4MjA0,size_16,color_FFFFFF,t_70)



```c

int a=020的奇怪输出 是16_第2张图片
,当使用%s %s读取输出的时候,则是正常的。



你可能感兴趣的:(c语言)