C/C++基础易错题整理5

1.若x 为整数, C语言 正确 表达 数学 式 0≤x<5的是() 。

A.0<=x<5
B.x=0||x=1||x=2||x=3||x=4
C.x>=0||x<5
D.!(x<0||x>=5)

正确答案: D 你的答案: B (错误)

A选项,0<=x<5这种写法在C语言中是错误的,应该写作:x >= 0 && x < 5; 所以A选项错误。
B选项,题干中说明x是整数,在x=0||x=1||x=2||x=3||x=4中,或运算符连接起来的每个表达式仅有一个等号,表示的是赋值而非判断相等,应该写作x0||x1||x2||x3||x==4,所以B选项错误。
C选项,x>=0||x<5相比原有的数学式扩大了范围,因此C选项是错误的。
D选项,!(x<0||x>=5),表示一个数或者不小于0,或者不大于等于5,即表示这个数大于等于0且小于5,因此能够正确表达题中的表达式,D选项正确。
综上,本题选择D。

2.若有以下说明,则对n的正确访问语句是( )。

class Y
{
//… ;
public:
static int n;
};
int Y::n;
Y objY;

A.n=1;
B.Y::n=1;
C.objY::n=1;
D.Y>n

正确答案: B 你的答案: C (错误)

A错在没有写出n的作用域。C错在对象后用作用域标识符,应该用点。D选项语法就错误了,是没有意义的表达式,类和对象没法比较。静态数据成员是使用类名而不是对象名来调用 因为静态数据成员只与类有关 而与具体对象无关,静态变量是所有类对象都可以共用的,并不是一个类的对象声明一个静态变量。

3.下面程序段输出结果是()。

short int i=32769printf("%d\n",i)

A.32769
B.32767
C.-32767
D.输出不是确定的数

正确答案: C 你的答案: D (错误)
short int 表示范围: -32768~32767 ,高于最大值输出最小值
这题考的是溢出,截断赋值。
32769是int常量,长度是4字节,二进制原码和补码都是00000000 00000000 10000000 00000001;
将32769赋值给short变量i时,由于i长度是2字节,发生截断赋值,只将低16位赋值给i,高16位溢出舍弃,所以i的补码是10000000 00000001,则原码是11111111 11111111,值是-32767

4.以下程序的输出结果为()。

main()
{
	int i=010,j=10;
	printf("%d,%d\n",++i,j--);
}

A.11,10
B.9,10
C.010,9
D.10,9

正确答案: B 你的答案: A (错误)
0开头是八进制,0X是十六进制
八进制的10是十进制的8。

5.下面程序的执行结果:

class A{
    public:
        long a;
};
class B : public A {
    public:
        long b;
};
void seta(A* data, int idx) {
    data[idx].a = 2;
}
int main(int argc, char *argv[]) {
    B data[4];
    for(int i=0; i<4; ++i){
        data[i].a = 1;
        data[i].b = 1;
        seta(data, i);
    }
    for(int i=0; i<4; ++i){
         std::cout << data[i].a << data[i].b;
    }
    return 0;
}

A.11111111
B.12121212
C.11112222
D.21212121
E.22221111

正确答案: E 你的答案: D (错误)

这道题应该注意 指针类型加减 时步长的问题。
A 大小为 4
B 大小为 8
那么:
void seta(A* data, int idx) {
data[idx].a = 2;
}
1)由于传入的实参为B类型,大小为8,而形参为A类型,大小为4
data[idx] 取 data + idx 处的元素,这时指针 data加1 的长度不是一个B长度,而是一个A长度,或者说是1/2个B长度。这时该函数中 data[0~3] 指向的是原 data[0].a,data[0].b,data[1].a,data[1].b,
由于隐式类型转换的缘故,data[0].a, data[0].b,data[1].a,data[1].b 处的值全部由于 data[idx].a = 2; 操作变为 2。
这道题如果改为void seta(B* data, int idx),那么形参中data指针加1步长为8,结果就是21212121。但是由于步长为4,所以结果就是 22221111。
2)因为seta函数参数为类A的指针,所以每当指针+1,指向的是下一个long类型数据,不是data[1].a,而是data[0].b的地址,所以前面4个数据被赋值为2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值