16.10.27 - 16.10.31笔记

1.下列 C 代码中,不属于未定义行为的有:______。
A int i=0;i=(i++);
B char *p=”hello”;p[1]=’E’
C char *p=”hello”;char ch=*p++
D int i=0;printf(“%d%d\n”,i++ i--)
E 都是未定义行为
F 都不是未定义行为

分析:
未定义行为(Undefined Behavior)是指C语言标准未做规定的行为。同时,标准也从没要求编译器判断未定义行为,
所以这些行为有编译器自行处理,在不同的编译器可能会产生不同的结果,又或者如果程序调用未定义的行为,
可能会成功编译,甚至一开始运行时没有错误,只会在另一个系统上,甚至是在另一个日期运行失败。
当一个未定义行为的实例发生时,正如语言标准所说,“什么事情都可能发生”,也许什么都没有发生
//B
http://selfboot.cn/2016/09/18/c++_undefined_behaviours/
2.哪个操作符不能作为类成员函数被重载?
A ?:
B ++
C []
D ==
E *

//A
3.
#include <stdio.h>
int main() {
    int a, b;
    for (a = 1, b = 1; a <= 100; a++) 
    {   if (b >= 20)
            break;
        if (b % 3 == 1)  
        {
            b += 3;
            continue;
        }
        b -= 5;
    }
    printf("%d\n", a);
    return 0;
}
上面的输出结果为?
//错误点: continue理解错误,跳过下面语句执行下次次循环

//分析: ab初始值为 1    1
   第一次:        2    4    
   第二次:        3    7/4  10/5   13/6   16/7  19/8  22结束  
4.以下代码输出什么?
int a =1,b =32 ;
printf("%d,%d",a<<b,1<<32);
A 1,1
B 1,0
C 0,0
D 0,1

//分析:
c++ primer 5th, 英文版 第153页 ,有句“the right-hand operand must not be nagative 
and must be a value that is strictly less than the number of bits in the result, 
otherwise,the operation is undefined.”

执行a<<b时,编译器会先将b与31进行and操作,以限制左移的次数小于等于31。b&31=0,则a<<b=1
执行1<<32时,编译器直接执行算术左移的操作。
选择B
5.下面这个程序执行后会有什么错误或者效果:
#define MAX 255
int main()
{
     unsigned char A[MAX], i;
     for (i = 0; i <= MAX; i++)
         A[i] = i;
}

//分析:
死循环加数组越界访问(C/C++不进行数组越界检查)
MAX=255
数组A的下标范围为:0..MAX-1,这是其一..
其二.当i循环到255时,循环内执行:
A[255]=255;
这句本身没有问题..但是返回for (i=0;i<=MAX;i++)语句时,
由于unsigned char的取值范围在(0..255),i++以后i又为0了..无限循环下去.
6.若有以下程序
#include<stdio.h>
main( )
{ 
    int a=-2,b=0;
    while(a++) ++b;
    printf("%d,%d\n",a,b);
}
则程序的输出结果是?

//第一次while判断条件中a++,先用后加,为-2不为0条件为真,执行a的自加与++b操作,
a的值变为-1,b的值变为1。第二次while判断后,a的值变为0,b的值变为2。
第三次while判断条件为假,但是仍要执行自加操作,即值为1,跳出循环。打印12
7.下列哪个用法那个是错误的( )
A typedef void (*FUN)();
B const int &ra;
C extern const int array[256];
D int* a;

//C++中引用要初始化。
//const修饰的常遍量要初始化。
//B
8.
"My salary was increased by 15%!"
下列哪个选项可以准确的显示出上述语句?
A printf("\"My salary was increased by 15/%\!\"\n");
B printf("My salary was increased by 15%!\n");
C printf("My salary was increased by 15'%'!\n");
D printf("\"My salary was increased by 15%%!\"\n");

//解析:
A: 没\!这转义符,编译时报错
BC: 一看前面输出时就少了双引号
D是对的,里面%%是输出的%,虽然有些编译器\%也能输出%,但貌似标准c不支持
        \" 将"转义
9.
Which of the following statement(s) equal(s) value 1 in C programming language?
A the return value of main function if program ends normally
B return (7&1)
C char *str="microsoft"; return str=="microsoft"
D return "microsoft"=="microsoft"
E None of the above

//
A.main成功返回,是0   
B. 按位与 7&1 = 111 & 001 = 0011  
C.str这个指针就是指向"microsoft"这个字符串常量的地址,所以,str == "microsoft" 自然是成立的,
D. 两个相同的字符串常量是放在同一个内存地址的,所以也相等
答案为BCD
10.math.h的abs返回值()
A 不可能是负数
B 不可能是正数
C 都有可能
D 不可能是0

//
num0或正数时,函数返回num值;

当num为负数且不是最小的负数时,
函数返回num的对应绝对值数,即将内存中该二进制位的符号位取反,并把后面数值位取反加一;

当num为最小的负数时(即0x80000000),由于正数里int类型32位表示不了这个数的绝对值
,所以依然返回该负数
11.下列代码的输出结果是
int i = -1;
unsigned j = 1;
if (j > i)
    printf(" (j>i)成立\n");
else
    printf(" (j>i)不成立\n");

if (i < j)
    printf(" (i<j)成立\n");
else
    printf(" (i<j)不成立\n");

A (j>i)成立,(i<j)成立
B (j>i)不成立,(i<j)成立
C (j>i)成立,(i<j)不成立
D (j>i)不成立,(i<j)不成立

//D
12.
下列程序段执行后,输出d的值为()
void main()
{
   int a=1,b=0,c=-1,d=0;
   d=++a||++b&&++c;
   cout<<d<<endl;
   return;
}

//
运算符优先级:&&>||>=
所以先计算++b&&++c,++c为0,所以整体是false=0,再计算++a||0,++a为true,
所以整体是true=1,所以d=1
13.
#include<stdio.h>
int main()
{
    unsigned char i=7;
    int j=0;
    for(;i>0;i-=3)
    {
       ++j;
     }
     printf("%d\n",j);
     return 0;
}
请问该程序的输出是多少?

//
7 4 1       ——3254 251....2——85255 252....3——853-30,就不会进入循环了,一共173
14.
有如下程序段:
char fun(char *);
main()
{
       char *s = “one”, a[5] = {0}, (*f1)(char *) = fun, ch;
}
则对函数fun的调用语句正确的是:
A *f1(&a);
B f1(*s);
C f1(&ch)
D ch = *f1(s);要改成(*f1)(s)才正确

//
CD 都正确,
D是正确的啊,不知道下面都是啥意思?  
函数指针在C++premier plus上写的很清楚,函数指针可以直接用f1(s)也可以用(*f1)(s) ,但是*f1(s)是错误的.
15.若有以下程序段:
……
int a[]={4,0,2,3,1},i,j,t;
for(i=1;i<5;i++)
{
t=a[i];
j=i-1;
while(j>=0&&t>a[j])
{
a[j+1]=a[j];
--j;
}
a[j+1]=t;
}
……
则该程序段的功能是:      
A 对数组a进行插入排序(升序)
B 对数组a进行插入排序(降序)
C 对数组a进行选择排序(升序)
D 对数组a进行选择排序(降序)

//
插入排序的原理:始终定义第一个元素为有序的,将元素逐个插入到有序排列之中,其特点是要不断的移动数据,
空出一个适当的位置,把待插入的元素放到里面去 

选择排序的原理:每次在无序队列中“选择”出最小值,放到有序队列的最后,并从无序队列中去除该值(具体实现略有区别)。
16.一张1024×640分辨率的图片,假定每个像素用16位色彩表示,用位图文件(bitmap)格式存储,则这张图片文件需要占用多大的存储空间____。
A 40KB
B 640KB
C 1280KB
D 2560KB
E 5120KB
F 10240KB

//1024*640*16 bit = 1024*640*16/8 B = 1024*640*16/8/1024 KB = 1280KB
17.
char a[] = "xyz", b[] = {'x', 'y', 'z'};
if (strlen(a) > strlen(b))
    printf("a > b\n");
else
    printf("a <= b\n");
//
char a[] = "xyz", b[] = {'x', 'y', 'z'};
a容易理解,strlen(a)=3;
b是数组,元素在内存中是连续存储的,而strlen函数求字符串长度是要以'\0'结尾,但是b没有'\0',
strlen的内部函数指针会一直向后搜索,直至找到'\0',内存中的其他区域也是有数据的,只是没有意义,
所以,strlen的指针最后指到哪里无法确定,但是结果肯定大于等于3.
18.
int **pp,*p,a=10,b=20;
pp=&p;
p=&a;
p=&b;
printf("%d,%d",*p,**pp)

//p最终指向的是b,而pp指向的是p,所以只要看p指向谁就知道输出结果,故都是输出20 20
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值