常见的面试题(整理)
生活随笔
收集整理的這篇文章主要介紹了
常见的面试题(整理)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
下面程序的輸出結果?
#include<stdio.h>int main(void) {int i = 300;//300 = (00000001 00101100)二進制char *ptr = (char*)(&i);// *ptr = 00101100 = 44 ptr指向低八位*++ptr = 2;// 00000001 變為 00000010 ++ptr指向高八位printf("%d\n",i);//i= (00000010 00101100) 二進制 = 556return 0; }結果:556
原因分析:在代碼(1)中定義了一個char型的指針類型,指向了變量i。整數300的二進制為00000001 00101100,在代碼(1)中根據Gdb的調試,打印出的*ptr=44,300存儲在內存中的格式如果是小端的話為:00101100 00000001 指向的是內存中的前一個字節,也就是前八位。在語句(2)中++ptr指向了00000001后八位,然后賦值為2,00000001 修改為00000010,所以這是i為00000010 00101100,十進制為556。
#include <stdio.h> int main(void) {unsigned int i;for(i=1;i>-2;i--){printf("C aptitude\n");}return 0; }結果:沒有任何的輸出。
原因分析:在程序中定義了unsigned int i;i是一個無符號的類型變量,當無符號的類型變量變和有符合的類型變量進行比較是,也就是1和-2進行比較,-2會自動轉變無符號整數,也就是轉換為4294967294。所以for循環不會執行,不能打印出 C aptitude。
這里主要涉及到C語音的整數自動轉換原則。當表達式中存在有符號類型和無符號類型時所有的操作數都自動轉換為無符號類型。因此,從這個意義上講,無符號數的運算優先級要高于有符號數。
linux中fork()函數詳解(原創!!實例講解)http://blog.csdn.net/jason314/article/details/5640969 ?不錯的博客
#include <stdio.h> #include <sys/types.h> #include <unistd.h> int main(void) {int num = 0;pid_t pid = fork();num +=1;if(pid ==0){sleep(2);printf("%d\n",num);}else{sleep(4);printf("%d\n",num);}return 0; }輸出結果為:
(隔4秒)1
(隔2秒)1
原因分析:fork一個進程會復制父進程的大部分資源,比如堆指針、棧指針和標志寄存器。但有些特性還是子進程所特有的,子進程中會把父進程的信號號位圖清除。因為子進程復制了父進程的數據,所以這里打印了兩次1.
基礎知識:
1)fork函數總是“調用一次,返回兩次”,在父進程中調用一次,在父進程和子進程中各返回一次。fork在子進程中的返回值是0,而在父進程中的返回值則是子進程的id。
2)子進程在創建的時候會復制父進程的當前狀態(PCB信息相同,用戶態代碼和數據也相同)。
3)程序運行的結果基本上是父子進程交替打印,但這也不是一定的,取決于系統中其它進程的運行情況和內核的調度算法。
輸出結果:0000
原因分析:該問題涉及到遞歸和靜態變量。Static變量i在每次調用時,并不會進行重新賦值,存儲在數據段,所有的調用共享同一個i.
#include <stdio.h> int main(void) {int i = 0;for(;i++;printf("%d",i));printf ("i = %d\n",i);return 0; }
輸出結果:i=1
原因分析:在進入循環后,判斷條件為i++時,這時候的i為0,不成立,所以不會執行printf("%d",i),所以輸出結果為i=1
總結
以上是生活随笔為你收集整理的常见的面试题(整理)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 二叉树(C语言)
- 下一篇: 面试的算法1(C语言)(整理)(组合数