自己犯的C语言错误(为面试而生)

来源:互联网 发布:棋逢对手 知乎 编辑:程序博客网 时间:2024/05/29 07:11

题目来源于各大网站和一些书籍,由于来源太多,这里就不一一列举了,毕竟目的只是用于记录学习。(不断更新中)

1.
  1. int a,b;
  2. a=b=1;
  3. b=a++,b++,++a;
  4. 求b的结果是多少?

 答案:
1. 这道题主要考查C语言逗号的作用,一开始我选择了b=3;我以为是这样的b=(a++,b++,++a);
然而事实确是这样的(b=a++),b++,++a;(逗号的优先级比赋值符号低,其实是最低的,结合方式从左到右),故答案是2,你对了吗?


2. 

有如下程序:

 

int a [3][2]={(0,1),(2,3),(4,5)};

int *p;

p=a [0];

printf("%d",p[0]);

 

输出结果是以下哪个选项?

A.0

B.1

C.2

D.编译出错

 

相信应该有不少人有和我一样,选择了A.0。但是遗憾的是答案是B.1。

选错的小伙伴应该是对二维数组的赋值和对逗号表达式不是很深入的了解。

其实应该是这样赋值的,int a[3][2]={{0,1},{2,3},{4,5}};

而题目中的由于使用的是()替代{},且逗号表达式的作用效果是从左到右的,

所以效果相当于int a [3][2]={1,3,5};,答案也就出来了。。

 

3.

有如下程序:

  1. int a=0,b=0;
  2. printf("%d,%d,%d",a++,++b,a+b);

输出结果应该是???

我想当然的结果是0,1,2

然而有C语言中的printf函数的出栈和入栈顺序中得出的结果却不是这样

printf函数入栈的顺序是从右到左,出栈的顺序则是从左到右。

即运算顺序为a+b,++b,a++;出栈顺序为先输出第一个%d对应的结果,从左到右类推。

则结果很明了即答案为0,1,0

PS:据说有些编译器不按规则来,得出了我之前想当然的结果,由于懒得再装一个C语言编译器,我也没有试试,

不过从中我们也有了些许收获,我们在写程序时,尽量避免这种关于运行时序先后的情况,可提高代码质量和可移植性。


4.

有如下程序:

  1. int *p;
  2. int  a = 10;
  3. *p = a;
  4. printf("%d",*p);
  5. 运行结果是什么?

  6. A.10
  7. B.a 的 地址值
  8. C.编译错误
  9. D.运行异常

我相信很多人可能和我一样选择了A,说明程序写的少。
其实这个题目考的是野指针。。。
野指针的成因主要有三种:
一、指针变量没有被初始化。任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。
二、指针p被free或者delete之后,没有置为NULL,让人误以为p是个合法的指针。
三、指针操作超越了变量的作用范围。比如不要返回指向栈内存的指针或引用,因为栈内存在函数结束时会被释放。

此题就是指针还没初始化,因此为野指针,执行 *p = a(应该是在初始化的时候赋予); 这步时,运行会异常。


原创粉丝点击