㈠ 高分救助:幫我答幾道c語言題
轉貼的,網路可是個好東東^_^
1.1 這道題主要考察#的功能,S是一個表達式。TRACE()的作用就伏虛敗是在DEBUG狀態下,計算表達式S的值之前先列印S。
1.2 #error用於向編譯器報缺顫錯,並輸出它後面帶的錯誤信息。例如:
#ifndef SOMETHING
#error SOMETHING not defined!
#endif
如果在這段代碼之前未定義過SOMETHING,則在編譯時出錯,並給出"SOMETHING not defined!"的錯誤信息。
作者: 增壓Q因斯坦 2007-1-12 06:20 回復此發言
--------------------------------------------------------------------------------
2 偶素新來的,請吧主多多關照
1.3 #define NELEMENTS(array) (sizeof(array) /譽鋒 sizeof((array)[0]))
1.4 #define OFFSET(structure, member) ((int) &(((structure *)0)->member))
2 (a) An integer:int a;
(b) A pointer to an integer:int *a;
&; A pointer to a pointer to an integer:int **a;
(d) An array of 10 integers:int a[10];
(e) An array of 10 pointers to integers:int *a[10];
(f) A pointer to an array of 10 integers:int (*a)[10];
(g) A pointer to a <I>function</I> that takes an integer as an argument and returns an integer:int (*a)(int);
(h) An array of 10 pointers to <I>function</I>s that take an integer argument and return an integer:int (*a[10])(int);
3 char (*(*x())[])();
這道題來自"The C Programming Language"中的一個例子。
首先,確定標識符:x
x是一個函數,沒有參數:x()
返回值是一個指針:*x()
這個指針指向一個數組:(*x())[]
數組中的每個元素是指針:*(*x())[]
指向一個不帶參數的函數:(*(*x())[])()
函數的返回值是char:char (*(*x())[])()
這里,要知道*、()和[]的優先順序。
4 這個定義有點怪,它的意思是:jmp_buf這種類型是一個數組,只有一個元素,元素類型為struct{...}。數組名作為函數參數時,應該是傳遞地址/指針。
5 在編譯源文件時,C編譯器和C++編譯器都會對符號(函數或變數)名作某些修正,但兩者採用的修正方法不同,所以兩者生成的目標文件不能互相鏈接。在C+ +中使用extern "C"可以讓C++符號獲得C鏈接特性。由於C++編譯器會自動定義__cplusplus宏,所以在C語言頭文件中採用這種結構可以保證無論使用何種編譯器,生成的目標文件都具有C鏈接特性,能夠與標准C編譯器所生成的目標文件相鏈接。
6 (1)用於全局變數:外部靜態變數,只能在本源文件中被引用,不能被其它源文件所引用。
(2)用於局部變數:局部靜態變數,在函數返回後存儲單元不釋放;下一次調用該函數時,該變數為上次函數返回時的值。
(3)用於函數:內部函數,只能被本源文件中的函數所調用,不能被其它源文件調用。
7.1 const關鍵字在C語言中用於聲明"常變數",其值不可修改,但具有確定的數據類型。C編譯器總是為其分配相應的存儲單元。
在C++中,const關鍵字用於聲明常量,C++編譯器視具體情況決定是為其分配存儲單元還是僅將其作為編譯期間的常量。
7.2 const int a1; a1是整型常量。
int const a2; a2是整型常量。等同於const int a2;
const int *a3; a3是指針(a3是可變的),指向一個整型常量。等同於int const *a3;
int * const a4; a4是常量指針(a4不可變),指向一個整型變數。
int const * const a5; a5是常量指針(a5不可變),指向一個整型常量。等同於const int * const a5;
8.1 volatile關鍵字用於聲明內存映射的易失型變數,這類變數的值隨時可能由於某種編譯器所不知道的原因(例如,外部設備對其寫入)所改變,所以編譯器在進行代碼優化時不能對其做任何的假設和依賴。
8.2 volatile可以和const一起使用,不過很少見。
const關鍵字的意思是限制編程者自己不能修改變數的值;兩者並不矛盾。
例如一個內存映射的、只讀的硬體寄存器,假設它的地址是p,則可以這樣聲明:volatile const UINT32 *p;
9 sizeof(pmsg) = 指針變數的長度
sizeof(msg) = 2 (字元數組的長度)
sizeof("A") = 2 (字元串的長度)
sizeof(ch) = 1 (字元變數的長度)
sizeof(『A』) = 整型變數的長度 (在C語言中,字元常量的數據類型實際上是int;在C++中,它的數據類型是char,從而原式等於1)
sizeof(param) = 指針變數的長度 (數組名作參數時,傳遞的是數組的起始地址)
10 這種寫法是和編譯器&操作系統相關的,所以不應當這樣寫。在WIN2K+VC環境下debug程序時會出現異常。
作者: 增壓Q因斯坦 2007-1-12 06:20 回復此發言
--------------------------------------------------------------------------------
3 偶素新來的,請吧主多多關照
不過這樣寫,編譯器不會報錯。按道理,"hello..."的類型是const char [N],它是不能賦值給char *的,
因為會丟失常量屬性。但在const關鍵字成為C標准之前,大家都這樣寫程序,所以char *pmsg = "hello..."
這種寫法被給予特別豁免,即使在C++中也是如此,在"The C++ Programming Language"的附錄里對此有討論。
"hello, world!"是字元串常量(string literal),它的類型是const char [N],N為字元串的長度(包括結尾的0)。
"The C Programming Language"指出,寫字元串常量的結果是未定義的(undefined)。所以在有些平台(操作系統+編譯器)
上程序不會出錯,而在其它平台上程序出現異常。
GNU手冊里這樣說:
Writing into string constants is a very bad idea; "constants" should be constant.
不過在GNU中它提供另外的選擇:使用-fwritable-strings進行編譯就可以。
那麼,為什麼不允許修改字元串常量呢(它不也在內存中嗎)?
這可能和另外一個特點有關,即重復字元串的合並。現在的編譯器應該會主動幫助我們合並程序中相同的字元串常量
以節省內存。如果string literal可寫,就會出現問題。例如:
void foo()
{
printf("%s\n", "how are you?");
}
void bar()
{
char *p = "how are you?";
strcpy(p, "WHO ARE YOU?");
}
調用foo()當然會列印"how are you"。但如果編譯器合並字元串,那麼先調用bar(),再調用foo(),foo()列印的就是
"WHO ARE YOU?"。這當然不是我們想要的結果。
另外一方面,這樣寫也有問題(確實有人這么寫):
if (func() == "something")
...
func()是:
char *func()
{
...
return "something";
}
這就假設編譯器一定會幫我們合並字元串,然而那也不一定。
11 輸出"> 6"。
混合運算時的數據類型轉換次序:int --> unsigned --> long --> double。
另外,char和short必定轉換為int,float必定轉換為double。
12 p = (int *)((unsigned int)a + 1);
代碼的意圖是想使p指向數組的第二個元素,但通常的寫法是:p=a+1。這里存在這樣的問題:a是個常量地址,
a+1指向下一個數組元素,而((unsigned int)a + 1)指向下一個內存地址。如果地址是位元組計數的,則p指向的
是數組第一個元素的第二個位元組。還有一個效果就是:在RISC上該printf語句會出異常,因為不允許非對齊訪問
(mis-aligned access)。對齊訪問就是訪問2位元組變數的地址要能被2整除,4位元組變數的地址要能被4整除,etc。
13 這些函數到處都查得到,就不用做了吧.
【2 數據聲明和定義】
給定以下類型的變數a的定義式:
a) An integer int i = 0;
b) A pointer to an integer int *p = NULL;
c) A pointer to a pointer to an integer int **pp = NULL;
d) An array of 10 integers int a[10];
e) An array of 10 pointers to integers int *pa[10];
f) A pointer to an array of 10 integers int *ap = a;
g) A pointer to a <I>function</I> that takes an integer as an argument and returns an integer int ( *fp)( int )=NULL;
h) An array of ten pointers to <I>function</I>s that take an integer argument and return an integer typedef int( *fptype )( int );
fptype fpa[10];
【3 復雜類型(1)】
有如下表達式:
char (*(*x())[])();
請用文字描述x是什麼?
回答:聲明x是一個函數指針數組,函數的返回值類型是字元指針,參數為空。
空指針同志在《解釋一下 typedef int (*fn_ptr)()》這篇帖子里說過
c專家編程中理解c語言聲明的優先順序原則,如下:
1) 聲明從它的名字開始讀取,然後按照優先順序順序依次讀取
2) 優先順序地從高到低的順序是
a)聲明中括弧被括起來的部分
b)後綴操作符:
括弧()表示這是一個函數,方括弧表示這是一個數組
作者: 增壓Q因斯坦 2007-1-12 06:20 回復此發言
--------------------------------------------------------------------------------
4 偶素新來的,請吧主多多關照
c)前綴操作符,*表示這是一個指針
3)如果有const或volatile後面緊跟類型說明符如int等,那麼它作用於類型說明符,在其它情況下,const等作用於緊鄰的指針星號。
還真派上用場了,特致謝,不知對不對。
【4 復雜類型(2)】
jmp_buf的定義:
typedef struct _jmp_buf
{
REG_SET reg;
int extra[3];
} jmp_buf[1];
setjmp函數的原型:
extern int setjmp (jmp_buf __env);
問:調用setjmp時傳遞__env的內容,還是傳遞指針?
答:傳遞指針。由jmp_buf 的定義來看,它是一個數組類型,並且只含一個元素。由此_env是一個數組,在函數的形參中,任何形式的數組都是指針等價的,傳遞參數時數組名將轉化為相應的指針類型。實際上,在所有表達式中都是如此。
為什麼要把jmp_buf定義為數組呢?因為setjmp需要改變__env的內容,這必須要用指針才行。但為什麼不直接把參數定義為指針類型而是用這樣一種奇特的方法,我也不清楚。
【5 頭文件】
問:為什麼標准頭文件都有類似以下的結構?
#ifndef __INCvxWorksh
#define __INCvxWorksh
#ifdef __cplusplus
extern "C" {
#endif
/*...*/
#ifdef __cplusplus
}
#endif
#endif /* __INCvxWorksh */
這個不太會,但試一試。
答:為了使c++兼容c,在c++中也能調用c的標准庫。如果定義了__cplusplus測試宏,則編譯時進行extern "C"聲明。
#ifndef __INCvxWorksh
#define __INCvxWorksh
這倆是什麼不清楚。
【6 static關鍵字】
請說出static關鍵字的3種用處:
(1)用於全局變數;
(2)用於局部變數;
(3)用於函數。
/* file.c */
static int a; /* a只能在file.c中被引用*/
int b;
static int fn() /*fn只能在file.c中被引用*/
{
static int x; /* x的生存周期和程序的生存周期一樣 */
int y;
}
答:見注釋。
7.1 const關鍵字的意義是什麼?
7.2 解釋以下的變數定義:
const int a1; //a1為整型常量
int const a2; //同上
const int *a3; //a3整型指針常量,a3本身是個常量
int * const a4; //a4是整型常量指針,a4所指內容是常量
int const * const a5; //a5是整型常量指針常量,a5本身和a5所指內容都是常量
暈了
【9 sizeof()】
有以下定義:
char *pmsg = "A";
char msg[] = "A";
char ch = 'A';
答:
sizeof(pmsg) = 4 //32位編譯器
sizeof(msg) = 2 //字元'A'和'\0'
sizeof(「A」) = 2 //同上
sizeof(ch) = 1
sizeof(『A』) = 1 (在C++中等於多少?)
void f(char param[100])
{
// sizeof(param) = 4 //32位編譯器
}
評論Feed
㈡ c語言這題a2為什麼等於5
程序的解釋見圖