有趣的题目整理 Part 3

好像十一月初就要进行计算机二级的报名了。虽然ACM那边不能耽误但是这个证拿不到也不太好= =所以就协调一下两个事情的时间吧。

二级题目出错一般都是细节出错,真正理解有困难的知识点并不多。

这部分题目都比较sb,题解我可能会写的稍微少点。


1.若有定义语句 int x = 10;,则表达式 x -= x + x的值为:

A)0 B)-20 C)-10 D)10

+ 运算符的优先级大于 += 运算符,所以先算x + x,然后算x -= 算出来的东西。答案是C。

2.若有定义语句int year = 2009;,*p = &year;,以下不能使变量year中的值增至2010的是:

A)(*p)++; B)*p++; C)++(*p); D)*p+=1;

++ 运算符的优先级大于间接运算符*,所以B不可以。它会让指针p的地址增加1,但是所指向的值不会改变。

3.有如下程序段:

int x = 12;
double y = 3.141593;
printf("%d%8.6f", x, y);

其输出结果是:

A)123.141593 B)12 3.141593 C)12,3.141593 D)123.1415930

该题牵扯到格式输出。对于一个输出格式控制符%x.y来说,x代表输出的宽度,其实就是往屏幕上打印多少个字符,连带着小数点也一块算上的。所以如果这里写的是x的话实际上只能输出x-1位数,然后就是后面的y,它代表小数点后要保留y位。额外需要注意的是,是这两个设置有时候会造成冲突,比如说实际输出宽度很大,但是预设的宽度和小数点位数不足以正确表示这个数,它就会按照原格式输出。

4.设有定义 int a; float b;,执行scanf(“%2d%f”, &a, &b);语句时,如果从键盘输入876 543.0<回车>,则a和b的值分别是:

A)87和6.0 B)876和543.0 C)87和543.0 D)76和543.0

这里的%2d即指定宽度输出。指定宽度后到下一空格内数据不舍弃,但是出了空格就不再读。所以答案是A。

5.有以下程序:

(原题代码过于恶臭,修改之:)

#include <stdio.h>
int main() {
    int a = 1, b = 2, c = 3, d = 0;
    if (a == 1 && b++ == 2)
        if (b != 2 || c-- != 3)
            printf("%d,%d,%d\n", a, b, c);
        else
            printf("%d,%d,%d\n", a, b, c);
    else
        printf("%d,%d,%d\n", a, b, c);
    return 0;
}

程序的运行结果是?

A)1,3,2 B)1,3,3 C)1,2,3 D)3,2,1

这题体现了或运算的短路原则。它是指的,当做expa || expb运算时,如果已经计算出expa的值为true,那么该表达式将直接为true,而不去计算expb,从而提升性能。代码中的那个c–实际上是不执行的。所以应该选B而不是A。

题外话,有两道题被隐藏的分号搞到了,对答案的时候才发现,生气气qvq

6.有以下函数:

int fun(char *s) {
    char *t = s;
    while (*t++) ; //注意这个分号,笔者注
    //t--;
    //为什么要打上注释呢?因为这是下一个题(笑
    return (t - s);
}

该函数是干什么的?

A)计算串的长度 B)比较两个字符串的大小

C)计算s所指的字符串所占用内存字节的个数 D)将s所指的字符串复制到t中

咋一看很迷的一个函数,其实仔细分析不难发现,while里面的指针是不断向后跑的,一直跑到\0,对,就是那个\0,指针跑到这里就不再跑了,然后返回一个差值。字符串所占用内存字节的个数?每一个字符占1字节,所以这个也可以变相的理解为“长度”,只是注意那个\0,它在字符串里是实际存在的,但是在计算字符串长度的时候并不可以把它算进去,因为它是真实存在的,所以也要占一个字节,这样就可以解释后面的t–了。加了t–就是求串长度,不加就是算占用字节数。


-------------本文结束,感谢您的阅读转载请注明原作者及出处-------------

知识无价,码字不易。对您有用,敬请打赏。金额随意,感谢关心。