程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C語言的一些題目(最終)

C語言的一些題目(最終)

編輯:C++入門知識

一些覆蓋C語言許多知識點的題目,第一階段的課程從3月8日到現在已經進行了六周,
感覺自己不會的東西越來越多,面對計算機的時間也越來越長,眼睛現在已經有點模糊了,
希望自己能對得起自己的這份努力,加油,加油,加油!


____________________________________________________________


1.下面的程序輸出結果是多少?


#include


int main()
{
	int x=2,y,z;
	x *=(y = z = 5);printf("%d\n”,x);	//10 後面表達式的結果是5
	z = 3;
	x ==(y = z); printf("%d\n”,x);		//10 只是判斷,沒有給x賦值
	x =(y == z); printf("%d\n”,x);		//1
	x = (y&z); printf("%d\n”,x);		//3 位與操作
	x = (y&&z); printf("%d\n”,x);		//1
	y = 4;
	x = (y | z); printf("%d\n”,x);		//7 位或操作
	x = (y || z); printf("%d\n”,x);		//1
	return 0;
}



____________________________________________________________


2.下面的程序輸出結果是多少?


#include


main()
{
	int b = 3;
	int arr[] = {6,7,8,9,10};
	int *ptr = arr;
	*(ptr++)+=123;			// arr[0]變成129,ptr指向arr[1]
	printf("%d,%d\n",*ptr,*(++ptr));  
}




/*這種題目是很有爭議的,在vc和Linux的gcc編譯器下輸出的結果都是8,8。
但是在我的Mac系統下的gcc輸出的結果卻是7,8。在vc下的printf函數解釋是從右到左,
靠堆棧傳遞,所以*(++ptr)先進入堆棧,然後*ptr進入,具體的我也解釋不太清,坐等高人解答
*/




____________________________________________________________


3.下面的程序輸出結果是多少?


#include


int main()
{
	unsigned char a = 0xa5;     //a中裝著一個16進制數 二進制為:1010 0101
	unsigned char b = ~a>>4;    //a參與運算,自動轉換為int,b的結果二進制為
					//1111 0101
	printf("a = %d\n",a);		//a的十進制為165
	printf("b = %d\n",b);		//b的十進制為245
	return 0;
}


____________________________________________________________


4.下面程序的結果是多少?


#include


int main()
{
	unsigned int a = 0xCCCCCCF7;
	unsigned char i = (unsigned char)a; //i中裝著a的後兩位,也就是F7
	char* b = (char*)&a;	    	    //b指向a
	printf("%08x,%08x",i,*b);	    //16進制輸出,000000F7 ,FFFFFFF7
	return 0;
}


//這道題目也很有趣,普通的變量進入printf,補位的時候補0;
//然而指針變量補位的時候補的是F。
____________________________________________________________


5.用一個表達式,判斷一個數X是否是2n次方(2,4,8,16…),不可用循環語句。
(x & (x-1) == 0) ? printf("yes\n") : printf("yes\n")


運用位操作,2^n次方數的二進制只有1位是1,運用一個表達式就可以判斷。

____________________________________________________________


6.下面程序的結果是多少?
#include


main()
{
	int count = 0;
	int m = 9999;
	while(m)
	{
		count++;
		m = m&(m-1);
	} 
	printf("%d\n",count);      //8,進兩次循環m的二進制去掉一位
}


____________________________________________________________


7.如何將a和b的值進行交換,並且不使用任何中間變量。


a = a + b;
b = a - b;
a = a - b;


//還有更快的位操作版本:


a = a ^ b;
b = b ^ a;
a = a ^ b;


____________________________________________________________


8.編寫一個函數,要求輸入年、月、日、時、分、秒,輸出該時間的下一秒。
如輸入2010年12月31日23時59分59秒,則輸出2011年1月1日0時0分0秒。


就是單純的判斷,在這裡就不贅述了
____________________________________________________________


9.編寫一個函數,實現把C/C++程序代碼中的注釋去掉,並把結果返回。A.c---b.c


比較有難度的一道題,另寫一篇博文解釋。
____________________________________________________________


10.一個5位數字ABCDE*4 = EDCBA,這5個數字不重復,請編程求出來這個數是多少?


五個變量,五個循環加一個判斷就可以。
____________________________________________________________


11.用預處理指令#define聲明一個常數,用以表示1年中有多少秒(忽略閏年)。


#define S (365*24*60*60)


____________________________________________________________


12.編寫一個"標准"宏MIN,這個宏輸入兩個參數並返回其中較小的一個。


#define min((a), (b)) ((a)<(b))?(a):(b)


____________________________________________________________


13.const有什麼用途,請說出最少兩個。


1.定義常量
2.修飾,返回值,參數,函數,指針,在靜態編譯時讓編譯器幫助檢查是否對某些變量進行了修改


____________________________________________________________


14.const於#define相比有什麼不同?


(1) 編譯器處理方式不同
  define宏是在預處理階段展開。
  const常量是編譯運行階段使用。
(2) 類型和安全檢查不同
  define宏沒有類型,不做任何類型檢查,僅僅是展開。
  const常量有具體的類型,在編譯階段會執行類型檢查。
(3) 存儲方式不同
  define宏僅僅是展開,有多少地方使用,就展開多少次,不會分配內存。
  const常量會在內存中分配(可以是堆中也可以是棧中)。
____________________________________________________________


15.下面代碼的輸出結果是什麼?


#include


struct{
	short a1; 
	short a2;
	short a3;
	
}A;
struct{
	long a1;
	short a2;
}B;


int main()
{
	char* ss1 = "0123456789";
	char ss2[] = "0123456789";
	char ss3[100] = "0123456789";
	int ss4[100];
	char q1[] = "abc";
	char q2[] = "a\n";
	char* q3 = "a\n";
	char (*str1)[100] = (char(*)[100])malloc(100);
	void* str2 = (void*)malloc(100);
	printf("%d\n",sizeof(ss1));		//4
	printf("%d\n",sizeof(ss2));		//11
	printf("%d\n",sizeof(ss3));		//100
	printf("%d\n",sizeof(ss4));		//400
	printf("%d\n",sizeof(q1));		//4
	printf("%d\n",sizeof(q2));		//3
	printf("%d\n",sizeof(q3));		//4
	printf("%d\n",sizeof(A));		//6 結構體都跟其中最大的的元素類型對齊
	printf("%d\n",sizeof(B));		//16 跟long對齊,8*2
	printf("%d\n",sizeof(*str1));		//100
	printf("%d\n",sizeof(str2));		//4
return 0;
}



____________________________________________________________


16.下面程序的輸出結果是什麼?


#include


main()
{
	char *a []={"hello","the","world"};
	char **pa=a;
	pa++;
	printf(*pa);			//the
}


____________________________________________________________


17.以下代碼的輸出結果是什麼?


#include


int main()
{
	int x=10,
	    y=10,
	    i;	
	for(i=0;x>8;y=i++)
	{
		printf("%d,%d",x--,y);		//10, 10
		return 0;
	}
}


____________________________________________________________


18.下列程序會在哪一行崩潰?
typedef struct s {
	int i;
	int * p;
}S;


main()
{
	S s;			//定義一個結構體,其中有兩個元素,i 和 *p
	int *p = &s.i;		//定義指針變量p,裝著s中i的地址	    
	p[0] = 4;		//下標運算,在i中放入4
	p[1] = 3;		//在p中放入3
	s.p = p;		//把指針p中的地址,也就是s中i的地址給了s中的p
	s.p[1] = 1;		//下標運算,把s中的p的東西,也就是i的地址的下一位,也就是
					//s中p裝入一個1
	s.p[0] = 2;		//在這一行崩潰,p中裝著一個常量,無法進行寫操作
}




____________________________________________________________


19.
寫出函數指針、 // void (*pf)(); void func(); pf = &func;
函數返回指針、 // void* func();
const指針、 //char *const p;
指向const的指針、 // const char *p;
指向const的const指針。 // const char *const p;



















  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved