int a=020的奇怪输出 是16

int a=020的奇怪输出 是16

一个朋友问了我这样一个问题:为什么a的输出结果是16?在这里插入图片描述

#include<stdio.h>
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 <stdlib.h>
#include <string.h>
#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

在这里插入图片描述
,当使用%s %s读取输出的时候,则是正常的。



评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值