c语言面试精华版
1、下面的代碼輸出的結果是什么,并簡單分析結果。
#include <stdio.h>//無符號數與有符號數相加int main(int argc, char **argv) {unsigned int a = 6;int b = -12;if(a+b > 0){ printf("dsds\n");printf("a+b=%d\n" , a+b);printf("a+b=%p\n" , (void *)(a+b));}else{printf("ssss\n");printf("a+b=%d\n" , a+b);printf("a+b=%p\n" , (void *)(a+b));}return 0; } 答案:dsds
a+b=-6
a+b=0xFFFFFFFA
原因:當無符號數與有符號數相加時,將相加后的結果轉化為無符號數,為什么第一個結果是-6呢,因為%d輸出的時候是按照有符號數輸出的。第二個輸出語句就是按照內存里的內容輸出的。為什么是0xFFFFFFFA,-6的補碼就是0xFFFFFFFA,計算機在內存中存儲數據的格式是補碼的格式,所以打印出來的結果就是一個大于0的數。這就充分說明了a+b>0了。
2、下面的函數有什么錯誤:
int square(volatile int *ptr) {return *ptr * *ptr; }?編譯器將產生類似下面的代碼:
int square(volatile int *ptr) {int a,b;a = *ptr;b = *ptr;return a * b; } 答案:由于*ptr的值可能被意想不到的改變,因此a和b可能是不同的。結果,這段代碼可能返不是你所期望的平方值!正確的代碼如下:
long square(volatile int *ptr) {int a;a =*ptr;return a * a; }3、malloc(0)你注意過嗎?下面分析這段代碼:
#include<stdio.h> #include<stdlib.h>//malloc(0)函數 返回值不空int main(int argc, char **argv) {char *pointer;if((pointer = (char *)malloc(0)) == NULL){printf("is null pointer\n");printf("pointer:%p\n",pointer);*pointer = 'a';printf("%c\n",*pointer);free(pointer);}else{printf("is valited pointer\n");printf("pointer:%p\n",pointer);*pointer = 'b';printf("%c\n",*pointer);free(pointer);}return 0; } malloc(0)返回堆上的任意一個字節的地址,并且返回的地址空間可以對其進行操作。
運行結果:
is valited pointer
pointer:0x7f23adff
b
4、Typedef 在C語言中頻繁用以聲明一個已經存在的數據類型的同義字。也可以用預處理器做類似的事。例如,思考一下下面的例子,那個更好,為什么?
#define dPS struct s * typedef struct s * tPS; 答案是:typedef更好。思考下面的例子:
dPS p1,p2;
tPS p3,p4;
第一個擴展為
struct s * p1, p2;
上面的代碼定義p1為一個指向結構的指,p2為一個實際的結構,這也許不是你想
要的。第二個例子正確地定義了p3 和p4 兩個指針。
5、C語言同意一些令人震驚的結構,下面的結構是合法的嗎,如果是它做些什么?
int a = 5, b = 7, c; c = a+++b; 上面的代碼被處理成:
c = (a++)? +?? b;
因此, 這段代碼執行后的結果是 : a = 6, b = 7, c = 12。
總結
- 上一篇: 用C++设计一个不能被继承的类
- 下一篇: 一道关于宏的面试题及解答