1.下面代码段将打印出多少个‘=’?运用相关知识解释该输出。
int main(int argc, char *argv[]) { for (unsigned int i = 3; i >= 0; i--) putchar('='); }
运行结果:
死循环
分析:i是无符号整型变量,不可能变为负值,所以会死循环。
2.下列三种交换整数的方式是如何实现交换的?
/* (1) */ int c = a; a = b ; b = c; /* (2) */ a = a - b; b = b + a; a = b - a; /* (3) */ a ^= b ; b ^= a ; a ^= b;
第一个是通过中间变量,暂时储存一个数的值,来达到交换数值的目的的。
第二个是通过算法,通过计算将a和b的值转化成一个算数式子储存,以便交换。(数学)
第三种是通过异或的原理,相同的两个值异或为零,任何数与零异或值不变。
3.有如下代码段所示的函数 f,当我们执行该函数时,会产生什么样的输出结果?在同一程序中 多次执行该函数,输出结果是否一致?
void f() { static int a = 0; int b = 0; printf("%d, %d\n", ++a, ++b); }
执行结果:1 1
多次执行该结果是会变的,a是用static开辟的一个静态变量,是存在静态区的,函数执行结束后a所属的空间是不会被销毁的。
4.下面程序段的输出是什么?请解释该现象并说出与之相关尽可能多的知识。
int main(void) { printf("%d\n", printf("Xiyou Linux Group2%d", printf(""))); }
结果:Xiyou Linux Group2019
printf函数的返回值是写入的字符总数,此处写入了19个字符。
5.执行下面的代码段,会输出什么?请试着解释其原因,并叙述相关知识。
int main(int argc, char *argv[]) { char ch = 255; int d = 'a' + 1; printf("%d %d", ch, d); }
输出结果:-1 98
这道题考的是ascii码,ascii一般是127位,255是拓展出来的。
对于255:二进制是0000 0000 1111 1111,但char类型只有一个字节,所以他是以1111 1111存到内存中的,再以整型的方式往出来取时,会进行整形提升 ,1111 1111 1111 1111,然后转化为原码就是1000 0000 0000 0001,所以输出会是-1;.
对于d:a的ascii码为97,“+1”后就是98.
6.执行以下代码段,将产生什么样的输出?请对输出加以解释,并手动计算代码中 t 的值。
int main(int argc, char *argv[]) { char x = -2, y = 3; char t = (++x) | (y++); printf("x = %d, y = %d, t = %d\n", x, y, t); t = (++x) || (y++); printf("x = %d, y = %d, t = %d\n", x, y, t); }
执行结果:
x = -1, y = 4, t = -1
x = 0, y = 5, t = 1
-1|3
1111 1111 1111 1110
0000 0000 0000 0001
1111 1111 1111 1111——补码
1111 1111 1111 1110——反码
1000 0000 0000 0001——原码
所以是-1;
7.下面代码段的输出结果是什么?输出该结果的原因是?
#define X a+b int main(int argc, char *argv[]) { int a = 1, b = 1; printf("%d\n", X*X); }
输出结果:3
宏只是单纯的替换,不涉及运算符a+b*a+b
8.请解释下面代码段中每一句的效果。
int val = 2018; int *pi = 2019; pi = &val; *pi = 0;
第一句为给int类型变量val赋值,
第二句是给int类型指针变量pi赋值(这里是给int*类型赋值int类型,所以pi储存的的地址为2019),
第三句是将val的地址赋给pi。
第四句是通过地址找到val,将val修改为0