选择题
整形提升与算术转换
- 声明以下变量,则表达式: ch/i (f*d – i) 的结果类型为( )
char ch;
int i;
float f;
double d;
A: char
B: int
C: float
D: double
答案解析:
正确答案:D
基本数据类型的等级从低到高如下:char
int
long
float
double
运算的时候是从低转到高的,表达式的类型会自动提升或者转换为参与表达式求值的最上级类型
相关知识点:整形提升和算术转换在【C语言篇】操作符详解(下篇)有详细介绍
- 关于代码的说法正确的是( )
#include <stdio.h>
int main()
{
int x = -1;
unsigned int y = 2;
if (x > y)
{
printf("x is greater");
}
else
{
printf("y is greater");
}
return 0;
}
A: x is greater
B: y is greater
C: 依赖实现
D: 随机
答案解析:
正确答案:A
x是有符号数-1,内存中是全1,当有符号的x和无符号数进行比较时,x会隐式类型转换被当做无符号数,是一个很大的数, 这时就选择A了
其实还是等级的问题,无符号数等级高于同类型的有符号数,在比较或者计算时会先进行转换,同上一道题
左移右移操作符
- 下面函数的输出结果是( )
void func()
{
int k = 1^(1 << 31 >> 31);
printf("%dn", k);
}
A: 0
B: -1
C: -2
D: 1
答案解析:
正确答案:C
(1 << 31 );
左移31位,并在右侧填充0,得到0x80000000
,即符号位为1,其他为0,即-2147483648 int k = 1^(1 << 31 >> 31);
注意,这里在右移的时候采用的是算术右移,符号位保持为1,右移后填充1,结果为0xFFFFFFFF
,即-1, 0x00000001^0xFFFFFFFF
,即0xFFFFFFFE(-2)
相关知识点:左移右移操作符在【C语言篇】操作符详解(下篇)也有详细介绍
操作符优先级与结合性
- 请阅读以下程序,其运行结果是( )
nt main()
{
char c='A';
if('0'<=c<='9') printf("YES");
else printf("NO");
return 0;
}
A: YES
B: NO
C: YESNO
D: 语句错误
答案解析:
正确答案:A
'0'<=c<='9'
并非判断x大于等于字符0,小于等于字符9,而是先执行'0'<=c
,使用这个表达式的结果再和'9'
比较,'0'
的ASCII
码值 是48,'A'
的ASCII
码值是’65’,故'0'<c
是真值1,即字符9的ASCII
码值和1比较,最终是真
后置
- 有以下函数,该函数的功能是( )
int fun(char *s)
{
char *t = s;
while(*t )
;
return(t-s);
}
A: 比较两个字符的大小
B: 计算s所指字符串占用内存字节的个数
C: 计算s所指字符串的长度
D: 将s所指字符串复制到字符串t中
答案解析:
正确答案:B
循环在*t
为0
时停止,同时t
,t
最后会停在字符串结束的'