C語言你不可以錯過的8個經典題目
C語言你不可以錯過的8個經典題目
以下這些都是C語言中較為經典的例題,可以幫助大家在寫程序中少走彎路,少出點BUG。
1. 一下敘述中不正確的是(D)
A.在不同的函數中可以使用相同名字的變數
B.函數中的形式參數是在棧中保存
C.在一個函數內定義的變數只在本函數範圍內有效
D.在一個函數內複合語句中定義的變數在本函數範圍內有效
(複合語句值函數中的成對括弧構成)
註:D項是有錯誤的比如我舉個例子
#include
int man()
{
{
int a=10;
}
printf("%d
",a);
return 0;
}
這個如果再編譯中,一定會出現,a未定義的錯誤的。
想要一起學習C++的可以加裙二四八八九四四三零,裙內有各種資料滿足大家,歡迎加裙
2.
#include
#include
int main()
{
int i;
char acNEW[20];
for (i = 0; i
{
acNEW[i] = "0";
}
printf("%d
", strlen(acNEW));
system("pause");
return 0;
問題是求輸出結果: 這個答案應該不確定,因為呢它在為字元數組賦值時,並未賦 " " 但是strlen函數
認為結束的標準就是 " " ,所以當它讀到最後一位他會繼續走下去,直到它遇到 " ",因為後面是垃圾數據
數據都是隨機的所以strlen函數在讀時直到遇到 " " 它才會停下來,所以答案是不確定的。
3.全局變數可以定義在被多個.c文件包含著的頭文件中? 錯誤
這個在編譯時會報錯的,但是如果使用static修飾就可以編譯通過。
4.
在X86下,有這些程序:
#include
#include
int main()
{
union
{
short k;
char i[2];
}*s,a;
s = &a;
s->i[0] = 0x39;
s->i[1] = 0x38;
printf("%x
", a.k);
system("pause");
return 0;
這道題問的是輸出的什麼?這裡牽扯的知識點 聯合體和大小端存儲,x86是小端存儲,這種東西就得靠記了。。沒辦法大家都知道聯合體空間公用對吧,short長度為2B,char i[2]長度也為2B.所以你的a.k雖然並未賦值,但是你等於輸出了char i[2]數組中的內容,他們雖然名字不同現在他們內容是一樣的。 這就考驗我們大小端的概念了。
接下來下面是我畫的這道題的理解圖:
大家也知道讀取數據一般是從高位開始讀,比如一個數字 120 我們肯定是先看他最大的位對吧(高位)
所以這道題的答案是 3839
我再截圖驗證一下:
5.求下列程序輸出結果
#include
#include
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
#include
int main()
{
char c;
unsigned char uc;
unsigned short us;
c = 128;
uc = 128;
us = c + uc;
printf("0x%x
", us);
us = (unsigned char)c + uc;
us = c + (char)uc;
system("pause");
return 0;
}
做這道題前應該知道 char 的取值範圍是-128 ~ 127,所以當你給uc賦128的時候,它真實的值為-128.
具體我說的對不對? 看看運行結果。
想要一起學習C++的可以加裙二四八八九四四三零,裙內有各種資料滿足大家,歡迎加裙
7.
#include
#include
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
", sizeof(AAA_S1), sizeof(AAA_S2));
system("pause");
return 0;
}
求AAA_S再分別為1位元組對齊和四位元組對齊的情況下,佔用空間的大小:?
答案為 6 16.
這個問題就是位域的問題,我有專門關於結構體對齊的博客,不懂可以過去看一看。
8.
#include
#include
#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
", puc[0], puc[1], puc[2], puc[3]);
system("pause");
return 0;
}
這個主要還是位域,還有存儲的一些關係了。
因為按照位域存儲,該結構體只需要2個位元組即可存儲全部內容,然後開始思考他內部的結構。
下來我畫一個圖理解一下。
再看看運行的結果吧 有圖有真相。
這些題目都很經典,可以幫助我們理解一些藏在深處的知識,各種坑各種容易犯的錯誤。。
想要一起學習C++的可以加裙二四八八九四四三零,裙內有各種資料滿足大家,歡迎加裙
![](https://pic.pimg.tw/zzuyanan/1488615166-1259157397.png)
![](https://pic.pimg.tw/zzuyanan/1482887990-2595557020.jpg)
※Linux下C語言的幾道經典面試題
※C語言入門只需如此簡單
※C語言基礎——結構體
TAG:C加加 |
※不知道取什麼題目了,不寫題目了
※題目有十一個字不信你數
※窮盡腦力想不到一個合適的題目的題目
※我沒有想好這個離別的題目
※不知道什麼題目,只是突然這麼想的
※王維一首詩只有4句,有3句都描寫了不可能之景,看題目才明白!
※史上最奇葩的一首詩,題目就有50個字,大多數人連題目都背不出
※不知作者也沒有題目,28字古詩卻有4個「幾」,讀來如同一首歌
※所謂「癌症性格」是不是一個聳人聽聞的題目
※一篇不會起題目的文
※想不出題目了
※不知道起什麼題目了
※據說這是10個難倒無數人的面試題目……
※題目沒出好,作文寫不了
※今年的作文題目 你覺得哪個最難寫 網友直言「幸虧我已經考過了」
※看圖猜成語:有人說題目很簡單,可就是猜不對!
※這些走錯片場的猜成語題目,每一個,都能讓你懷疑智商
※為什麼做題目難以下手又盯著題目?
※這些詩的題目有近60個字,比內容還多,你見過最長的詩名是幾個字?
※看圖猜成語:挺簡單的,可是還有人連題目都看不懂!