說到C語言,可能有人以爲太簡單了c++
這有啥好說的數組
但素,,,,函數
今天小姐姐就遇到了一個這樣的事spa
因此說C語言裏面坑仍是不少的.net
今天就給你們準備了幾個筆試經典的題目code
能夠助你們順利經過筆試blog
1. 如下敘述中不正確的是(D)
A.在不一樣的函數中可使用相同名字的變量
B.函數中的形式參數是在棧中保存
C.在一個函數內定義的變量只在本函數範圍內有效
D.在一個函數內複合語句中定義的變量在本函數範圍內有效
(複合語句值函數中的成對括號構成)
注:D項是有錯誤的好比我舉個例子圖片
#include<stdio.h> int man() { { int a=10; } printf("%d\n",a); return 0; }
這個若是再編譯中,必定會出現,a未定義的錯誤的。get
2.博客
#include<stdio.h> #include<Windows.h> int main() { int i; char acNEW[20]; for (i = 0; i < 5; i++) { acNEW[i] = '0'; } printf("%d\n", strlen(acNEW)); system("pause"); return 0; }
問題是求輸出結果:
這個答案應該不肯定,由於它在爲字符數組賦值時,並未賦 '0' ,可是strlen函數認爲結束的標準就是 '0' ,因此當它讀到最後一位他會繼續走下去,直到它遇到 '0'。
由於後面是垃圾數據都是隨機的,因此strlen函數在讀時直到遇到 '0' 它纔會停下來,因此答案是不肯定的。
3.全局變量能夠定義在被多個.c文件包含着的頭文件中?
錯誤
這個在編譯時會報錯的,可是若是使用static修飾就能夠編譯經過。
4.在X86下,有這些程序:
include<stdio.h> include<Windows.h> int main() { union { short k; char i[2]; }*s,a; s = &a; s->i[0] = 0x39; s->i[1] = 0x38; printf("%x\n", a.k); system("pause"); return 0; } }
這道題問的是輸出的什麼?這裏牽扯的知識點 聯合體和大小端存儲,x86是小端存儲,這種東西就得靠記了。。沒辦法你們都知道聯合體空間公用對吧,short長度爲2B,char i[2]長度也爲2B.因此你的a.k雖然並未賦值,可是你等於輸出了char i[2]數組中的內容,他們雖然名字不一樣如今他們內容是同樣的。這就考驗咱們大小端的概念了。
接下來下面是我畫的這道題的理解圖:
你們也知道讀取數據通常是從高位開始讀,好比一個數字 120 咱們確定是先看他最大的位對吧(高位),因此這道題的答案是 3839
我再截圖驗證一下:
5.求下列程序輸出結果
#include<stdio.h> #include<Windows.h> int main() { unsigned char a = 200; unsigned char b = 100; unsigned char c = 0; c = a + b; printf("%d %d", a + b, c); system("pause"); return 0; }
這道題主要考的是你對unsigned的理解,接下來我畫一張圖幫你們理解
如今我說的對不對呢?你們看看輸出結果
6.在x86,vc++ 6.0環境下,有下列程序
#include<stdio.h> #include<Windows.h> int main() { char c; unsigned char uc; unsigned short us; c = 128; uc = 128; us = c + uc; printf("0x%x\n", us); us = (unsigned char)c + uc; printf("0x%x\n", us); us = c + (char)uc; printf("0x%x\n", us); system("pause"); return 0; }
作這道題前應該知道 char 的取值範圍是-128 ~ 127,因此當你給uc賦128的時候,它真實的值爲-128。
具體我說的對不對?看看運行結果。
7.
#include<stdio.h> #include<Windows.h> struct tagAAA { unsigned char ucld : 1; unsigned char ucpara : 2; unsigned char ucState : 6; unsigned char ucTail : 4; unsigned char ucAvail; unsigned char ucTail2; unsigned char ucData; }AAA_S1; struct tagAAA2 { unsigned int ucld : 1; unsigned int ucpara : 2; unsigned int ucState : 6; unsigned int ucTail : 4; unsigned int ucAvail; unsigned int ucTail2; unsigned int ucData; }AAA_S2; int main() { printf("%d %d\n", sizeof(AAA_S1), sizeof(AAA_S2)); system("pause"); return 0; }
求AAA_S再分別爲1字節對齊和四字節對齊的狀況下,佔用空間的大小:?
答案爲 6 16.
這個問題就是位域的問題,我有專門關於結構體對齊的博客,點擊這個連接就能看https://blog.csdn.net/Dawn_sf...
8.
#include<stdio.h> #include<Windows.h> #pragma pack(4); int main() { unsigned char puc[4]; struct sagPIM{ unsigned char ucpim1; unsigned char ucDate:1; unsigned char ucDate1:2; unsigned char ucDate2:3; }*pstPimData; pstPimData = (struct sagPIM*)puc; memset(puc, 0, 4); pstPimData->ucpim1 = 2; pstPimData->ucDate = 3; pstPimData->ucDate1 = 4; pstPimData->ucDate2 = 5; printf("%02x %02x %02x %02x\n", puc[0], puc[1], puc[2], puc[3]); system("pause"); return 0; }
這個主要仍是位域,還有存儲的一些關係了。
由於按照位域存儲,該結構體只須要2個字節便可存儲所有內容,而後開始思考他內部的結構。
下來我畫一個圖理解一下。
再看看運行的結果吧 有圖有真相。
這些題目都是歷年筆試的必考題,你們必定要仔細看看這裏面涉及的知識點呀,這樣筆試的時候才能過過過呀~~