C语言问题总结(二)

一、输入函数和输出函数

1.输入函数scanf

(1)

问题

解析

scanf函数中格式控制后面应该是变量地址,A选项中应为&ch,而不是ch,所以错误。getchar函数没有参数,所以B、C选项错误。

总结

输入字符可以使用scanf函数,也可以使用getchar函数,注意getchar函数没有参数,并且一次调用只能输入一个字符。

其次scanf函数的使用如格式控制,格式的声明都要注意。

(2)

问题

总结

%m.nf格式是printf函数独有的,scanf函数不支持这个格式。

2.逗号表达式

问题

解析

这个表达式输入逗号表达式,从左往右执行每个表达式,值为最后一个表达式的值。本题执行顺序是先执行(k=3*2,k+4),而括号里先执行k=3*2,则k为6;再执行k+4,则k为10。所以括号内表达式得出的值就为10,此时整体变为10,k*3;k*3为18,所以最后表达式的值为18。

问题

解析

先执行右边的表达式,括号内也是一个逗号表达式,先执行a=5,然后执行b=5,随后a自减1变为4,;逗号表达式的值为b的值即5,再赋值给x。所以最后x为5,a为4,b也为5。

3.输出函数printf

3.1和逗号表达式的区别

printf函数的形式可以表现为printf(参数1,参数2,参数3,……,参数n),参数1就是指定输出格式,其余参数也可以出现表达式。但它们并不是逗号表达式,它们仍属于参数,只是用逗号分隔开来。 

这里需要注意的是,根据编译器不同,得到的结果也会不同,有些编译器按从右到左的顺序求值参数,这个顺序执行下来,输出是1,1,1。但是有些编译器是从左到右的顺序,这样就是1,2,2。输出是严格按照从左到右进行输出的。

本人接触的都是从右到左的顺序,所以这道题选A。

4.格式符

(1)带符号和不带符号

d和i都是带符号十进制形式,o、x(X)、u都是无符号形式并且不带前导符。如:c=026,以%o格式输出时为26。

y被默认定义成unsigned  int,即无符号整型,则C、D不符合条件,而A中%d是有符号的十进制,也不符合题意,所以选B。

(2)-1和65535

#include <stdio.h>
void main() {

	int a = -1;
	printf("%u,%o,%x\n", a,a);

	unsigned b = 65535;
	printf("%d,%o,%x",b,b,b);
  }

首先看运行结果:

 

事实上,这是因为unsigned的位数是由系统决定的,图中的运行结果是在32位系统情况下得到的。

65535实际变为二进制是1111111111111111(共16个1),但是在32位系统里他还需要在前面再添加16个0。这样在转为有符号的十进制时,因为最高位是0,所以计算下来为65535。

但是在16位系统里,它就只有16位,即16个1,这时候因为全为1表示-1的补码。所以按有符号十进制输出就为-1。

同样地,对于-1,在32位系统里以无符号整型输出应该为4294967295(即32位全为1的二进制)

所以具体得到什么值要看系统位数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值