從 http://c-faq-chn.sourceforge.net/ccfaq/index.html 轉載過來,學習C的好助手。
- 目錄
- 1. 前言
- 2. 聲明和初始化
- 2.1 我如何決定使用那種整數類型?
- 2.2 64?位機上的?64?位類型是什么樣的?
- 2.3 怎樣定義和聲明全局變量和函數最好?
- 2.4 extern?在函數聲明中是什么意思?
- 2.5 關鍵字?auto?到底有什么用途?
- 2.6 我似乎不能成功定義一個鏈表。我試過?typedef struct {char *item;NODEPTR next;} *NODEPTR;?但是編譯器報了錯誤信息。難道在C語言中一個結構不能包含指向自己的指針嗎?
- 2.7 怎樣建立和理解非常復雜的聲明?例如定義一個包含?N?個指向返回指向字符的指針的函數的指針的數組?
- 2.8 函數只定義了一次, 調用了一次, 但編譯器提示非法重定義了。
- 2.9 main()?的正確定義是什么??void main()?正確嗎?
- 2.10 對于沒有初始化的變量的初始值可以作怎樣的假定?如果一個全局變量初始值為?``零", 它可否作為空指針或浮點零?
- 2.11 代碼?int f() { char a[] = "Hello,world!";}?不能編譯。
- 2.12 這樣的初始化有什么問題?char *p = malloc(10);?編譯器提示?``非法初始式"?云云。
- 2.13 以下的初始化有什么區別?char a[] = "stringliteral"; char *p = "stringliteral"; 當我向?p[i]?賦值的時候, 我的程序崩潰了。
- 2.14 我總算弄清除函數指針的聲明方法了, 但怎樣才能初始化呢?
- 3. 結構、聯合和枚舉
- 3.1 聲明?struct x1 { ...};?和?typedef struct { ...} x2;有什么不同?
- 3.2 為什么?struct x { ...}; x thestruct;?不對?
- 3.3 一個結構可以包含指向自己的指針嗎?
- 3.4 在?C?語言中實現抽象數據類型什么方法最好?
- 3.5 在?C?中是否有模擬繼承等面向對象程序設計特性的好方法?
- 3.6 我遇到這樣聲明結構的代碼: struct name {int namelen; charnamestr[1];};?然后又使用一些內存分配技巧使?namestr?數組用起來好像有多個元素。這樣合法和可移植嗎?
- 3.7 是否有自動比較結構的方法?
- 3.8 如何向接受結構參數的函數傳入常數值?
- 3.9 怎樣從/向數據文件讀/寫結構?
- 3.10 我的編譯器在結構中留下了空洞, 這導致空間浪費而且無法與外部數據文件進行?"二進制"?讀寫。能否關掉填充, 或者控制結構域的對齊方式?
- 3.11 為什么?sizeof?返回的值大于結構的期望值,是不是尾部有填充?
- 3.12 如何確定域在結構中的字節偏移?
- 3.13 怎樣在運行時用名字訪問結構中的域?
- 3.14 程序運行正確, 但退出時卻?``core dump''了,怎么回事?
- 3.15 可以初始化一個聯合嗎?
- 3.16 枚舉和一組預處理的?#define?有什么不同?
- 3.17 有什么容易的顯示枚舉值符號的方法?
- 4. 表達式
- 4.1 為什么這樣的代碼:?a[i] = i++;?不能工作?
- 4.2 使用我的編譯器,下面的代碼?int i=7; printf("%d\n",i++ * i++);?返回?49?不管按什么順序計算, 難道不該打印出56嗎?
- 4.3 對于代碼?int i = 3; i = i++;?不同編譯器給出不同的結果, 有的為?3, 有的為?4,哪個是正確的?
- 4.4 這是個巧妙的表達式:?a ^= b ^= a ^= b?它不需要臨時變量就可以交換?a?和?b?的值。
- 4.5 我可否用括號來強制執行我所需要的計算順序?
- 4.6 可是?&&?和?||?運算符呢?我看到過類似?while((c = getchar()) != EOF &&c != '\n')?的代碼?……
- 4.7 我怎樣才能理解復雜表達式?``序列點"?是什么?
- 4.8 那么, 對于?a[i] = i++;?我們不知道?a[]?的哪一個分量會被改寫,但?i?的確會增加?1, 對嗎?
- 4.9 ++i?和?i++?有什么區別?
- 4.10 如果我不使用表達式的值, 我應該用?++i?或?i++?來自增一個變量嗎?
- 4.11 為什么如下的代碼?int a = 100, b = 100; long int c = a * b;?不能工作?
- 4.12 我需要根據條件把一個復雜的表達式賦值給兩個變量中的一個。可以用下邊這樣的代碼嗎??((condition) ? a : b) = complicated_expression;
- 5. 指針
- 5.1 我想聲明一個指針并為它分配一些空間, 但卻不行。這些代碼有什么問題?char *p; *p = malloc(10);
- 5.2?*p++?自增?p?還是?p?所指向的變量?
- 5.3 我有一個?char *?型指針正巧指向一些?int?型變量, 我想跳過它們。為什么如下的代碼 ((int *)p)++; 不行?
- 5.4 我有個函數,它應該接受并初始化一個指針?void f(int *ip) { static int dummy = 5; ip = &dummy;}但是當我如下調用時: int *ip; f(ip); 調用者的指針卻沒有任何變化。
- 5.5 我能否用?void**?指針作為參數, 使函數按引用接受一般指針?
- 5.6 我有一個函數?extern int f(int *);?它接受指向?int?型的指針。我怎樣用引用方式傳入一個常數?下面這樣的調用?f(&5);?似乎不行。
- 5.7 C?有?``按引用傳遞"?嗎?
- 5.8 我看到了用指針調用函數的不同語法形式。到底怎么回事?
- 5.9 我怎樣把一個?int?變量轉換為?char *?型?我試了類型轉換, 但是不行。
- 6. 空?(null)?指針
- 6.1 臭名昭著的空指針到底是什么?
- 6.2 怎樣在程序里獲得一個空指針?
- 6.3 用縮寫的指針比較?``if(p)"?檢查空指針是否可靠?如果空指針的內部表達不是?0?會怎么樣?
- 6.4 NULL?是什么, 它是怎么定義的?
- 6.5 在使用非全零作為空指針內部表達的機器上, NULL?是如何定義的?
- 6.6 如果?NULL?定義成?#define NULL ((char *)0)?難道不就可以向函數傳入不加轉換的?NULL?了嗎?
- 6.7 如果?NULL?和?0?作為空指針常數是等價的, 那我到底該用哪一個呢?
- 6.8 但是如果?NULL?的值改變了, 比如在使用非零內部空指針的機器上,難道用?NULL (而不是?0)?不是更好嗎?
- 6.9 用預定義宏?#define Nullptr(type) (type *)0?幫助創建正確類型的空指針。
- 6.10 這有點奇怪。NULL?可以確保是?0, 但空?(null)?指針卻不一定?
- 6.11 為什么有那么多關于空指針的疑惑?為什么這些問題如此經常地出現?
- 6.12 我很困惑。我就是不能理解這些空指針一類的東西。
- 6.13 考慮到有關空指針的所有這些困惑, 難道把要求它們內部表達都必須為?0?不是更簡單嗎?
- 6.14 說真的, 真有機器用非零空指針嗎, 或者不同類型用不同的表達?
- 6.15 運行時的?``空指針賦值"?錯誤是什么意思?
- 7. 數組和指針
- 7.1 我在一個源文件中定義了?char a[6], 在另一個中聲明了?extern char *a?。為什么不行 ?
- 7.2 可是我聽說?char a[ ]?和?char *a?是一樣的。
- 7.3 那么, 在?C?語言中?``指針和數組等價"?到底是什么意思 ?
- 7.4 那么為什么作為函數形參的數組和指針申明可以互換呢 ?
- 7.5 如果你不能給它賦值, 那么數組如何能成為左值呢 ?
- 7.6 現實地講, 數組和指針地區別是什么 ?
- 7.7 有人跟我講, 數組不過是常指針。
- 7.8 我遇到一些?``搞笑"?的代碼, 包含?5["abcdef"]?這樣的?``表達式"。 這為什么是合法的?C?表達式呢 ?
- 7.9 既然數組引用會蛻化為指針, 如果?arr?是數組, 那么?arr?和?&arr?又有什么區別呢 ?
- 7.10 我如何聲明一個數組指針 ?
- 7.11 我如何在運行期設定數組的大小 ? 我怎樣才能避免固定大小的數組 ?
- 7.12 我如何聲明大小和傳入的數組一樣的局部數組 ?
- 7.13 我該如何動態分配多維數組 ?
- 7.14 有個靈巧的竅門: 如果我這樣寫?int realarray[10];int *array = &realarray[-1];?我就可以把?``array"?當作下標從?1?開始的數組。
- 7.15 當我向一個接受指針的指針的函數傳入二維數組的時候,編譯器報錯了。
- 7.16 我怎樣編寫接受編譯時寬度未知的二維數組的函數 ?
- 7.17 我怎樣在函數參數傳遞時混用靜態和動態多維數組 ?
- 7.18 當數組是函數的參數時, 為什么?sizeof?不能正確報告數組的大小 ?
- 8. 內存分配
- 8.1 為什么這段代碼不行?char *answer;printf("Type something:\n");gets(answer);printf("You typed\"%s\"\n",answer);
- 8.2 我的?strcat()?不行.我試了?char *s1 = "Hello, "; char *s2 ="world!"; char *s3 = strcat(s1, s2);?但是我得到了奇怪的結果。
- 8.3 但是?strcat?的手冊頁說它接受兩個?char *?型參數。我怎么知道?(空間)?分配的事情呢?
- 8.4 我剛才試了這樣的代碼?char *p;strcpy(p, "abc");?而它運行正常?怎么回事?為什么它沒有崩潰?
- 8.5 一個指針變量分配多少內存?
- 8.6 我有個函數, 本該返回一個字符串, 但當它返回調用者的時候,返回串卻是垃圾信息。
- 8.7 那么返回字符串或其它集合的爭取方法是什么呢?
- 8.8 為什么在調用?malloc()?時, 我得到?``警告:整數賦向指針需要類型轉換"?
- 8.9 為什么有些代碼小心地把?malloc?返回的值轉換為分配的指針類型。
- 8.10 在調用?malloc()?的時候, 錯誤?``不能把?void *?轉換為?int *"?是什么意思?
- 8.11 我見到了這樣的代碼?char *p = malloc(strlen(s) + 1);strcpy(p, s);?難道不應該是?malloc((strlen(s) + 1) * sizeof(char))?
- 8.12 我如何動態分配數組?
- 8.13 我聽說有的操作系統程序使用的時候才真正分配?malloc?申請的內存。這合法嗎?
- 8.14 我用一行這樣的代碼分配一個巨大的數組, 用于數字運算:?double *array = malloc(300 * 300 * sizeof( double ));?malloc()?并沒有返回?null, 但是程序運行得有些奇怪, 好像改寫了某些內存,或者?malloc()?并沒有分配我申請的那么多內存, 云云。
- 8.15 我的?PC?有?8?兆內存。為什么我只能分配?640K?左右的內存?
- 8.16 我的程序總是崩潰, 顯然在?malloc?內部的某個地方。 但是我看不出哪里有問題。是?malloc()?有?bug?嗎?
- 8.17 動態分配的內存一旦釋放之后你就不能再使用, 是吧?
- 8.18 為什么在調用?free()?之后指針沒有變空?使用?(賦值, 比較)?釋放之后的指針有多么不安全?
- 8.19 當我?malloc()?為一個函數的局部指針分配內存時, 我還需要用?free()?明確的釋放嗎?
- 8.20 我在分配一些結構, 它們包含指向其它動態分配的對象的指針。我在釋放結構的時候, 還需要釋放每一個下級指針嗎?
- 8.21 我必須在程序退出之前釋放分配的所有內存嗎?
- 8.22 我有個程序分配了大量的內存, 然后又釋放了。但是從操作系統看,內存的占用率卻并沒有回去。
- 8.23 free()?怎么知道有多少字節需要釋放?
- 8.24 那么我能否查詢?malloc?包, 可分配的最大塊是多大?
- 8.25 向?realloc()?的第一個參數傳入空指針合法嗎?你為什么要這樣做?
- 8.26 calloc()?和?malloc()?有什么區別?利用?calloc?的零填充功能安全嗎?free()?可以釋放?calloc()?分配的內存嗎, 還是需要一個?cfree()?
- 8.27 alloca()?是什么?為什么不提倡使用它?
- 9. 字符和字符串
- 9.1 為什么?strcat(string, '!');?不行?
- 9.2 我在檢查一個字符串是否跟某個值匹配。 為什么這樣不行?char *string;...if(string == "value") {/* string matches "value" */...}
- 9.3 如果我可以寫?char a[] = "Hello, world!";?為什么我不能寫?char a[14];a = "Hello, world!";
- 9.4 我怎么得到對應字符的數字?(字符集)?值, 或者相反?
- 9.5 我認為我的編譯器有問題: 我注意到?sizeof('a')?是?2?而不是?1?(即, 不是?sizeof(char))。
- 10. 布爾表達式和變量
- 10.1 C?語言中布爾值的候選類型是什么?為什么它不是一個標準類型?我應該用?#define?或?enum?定義?true?和?false?值嗎?
- 10.2 因為在?C?語言中所有的非零值都被看作?``真", 是不是把?TRUE?定義為?1?很危險?如果某個內置的函數或關系操作符?``返回"?不是?1?的其它值怎么辦?
- 10.3 當?p?是指針時,?if(p)?是合法的表達式嗎?
- 11. C?預處理器
- 11.1 這些機巧的預處理宏:?#define begin {?#define end }?你覺得怎么樣?
- 11.2 怎么寫一個一般用途的宏交換兩個值?
- 11.3 書寫多語句宏的最好方法是什么?
- 11.4 我第一次把一個程序分成多個源文件, 我不知道該把什么放到?.c?文件,把什么放到?.h?文件。(``.h"?到底是什么意思?)
- 11.5 一個頭文件可以包含另一頭文件嗎?
- 11.6 #include <>?和?#include 有什么區別?
- 11.7 完整的頭文件搜索規則是怎樣的?
- 11.8 我在文件的第一個聲明就遇到奇怪的語法錯誤, 但是看上去沒什么問題。
- 11.9 我包含了我使用的庫函數的正確頭文件, 可是連接器還是說它沒有定義。
- 11.10 我在編譯一個程序, 看起來我好像缺少需要的一個或多個頭文件。誰能發給我一份?
- 11.11 我怎樣構造比較字符串的?#if?預處理表達式?
- 11.12 sizeof?操作符可以用于?#if?預編譯指令中嗎?
- 11.13 我可以在?#include?行里使用?#ifdef?來定義兩個不同的東西嗎?
- 11.14 對?typdef?的類型定義有沒有類似?#ifdef的東西?
- 11.15 我如何用?#if?表達式來判斷機器是高字節在前還是低字節在前?
- 11.16 我得到了一些代碼, 里邊有太多的?#ifdef。 我不想使用預處理器把所有的?#include?和?#ifdef?都擴展開, 有什么辦法只保留一種條件的代碼呢?
- 11.17 如何列出所有的預定義標識符?
- 11.18 我有些舊代碼, 試圖用這樣的宏來構造標識符?#define Paste(a, b) a/**/b?但是現在不行了。
- 11.19 為什么宏?#define TRACE(n) printf("TRACE: %d\n", n)?報出警告?``用字符串常量代替宏"?它似乎應該把?TRACE(count);?擴展為?printf("TRACE: %d\count", count);
- 11.20 使用?#?操作符時, 我在字符串常量內使用宏參數有問題。
- 11.21 我想用預處理做某件事情, 但卻不知道如何下手。
- 11.22 怎樣寫參數個數可變的宏?
- 12. ANSI/ISO?標準?C
- 12.1 什么是?``ANSI C?標準"?
- 12.2 我如何得到一份標準的副本?
- 12.3 我在哪里可以找到標準的更新?
- 12.4 很多?ANSI?編譯器在遇到以下代碼時都會警告類型不匹配。?extern int func(float);int func(x)float x;{ ...
- 12.5 能否混用舊式的和新型的函數語法?
- 12.6 為什么聲明?extern int f(struct x *p);?報出了一個奇怪的警告信息?``結構?x?在參數列表中聲明"?
- 12.7 我不明白為什么我不能象這樣在初始化和數組維度中使用常量:const int n = 5;int a[n];
- 12.8 既然不能修改字符串常量, 為什么不把它們定義為字符常量的數組?
- 12.9 ``const char *p"?和?``char * const p"?有何區別?
- 12.10 為什么我不能向接受?const char **?的函數傳入?char **?
- 12.11 怎樣正確聲明?main()?
- 12.12 我能否把?main()?定義為?void, 以避免擾人的?``main無返回值"?警告?
- 12.13 可?main()?的第三個參數?envp?是怎么回事?
- 12.14 我覺得把?main()?聲明為?void?不會失敗, 因為我調用了?exit()?而不是?return?, 況且我的操作系統也忽略了程序的退出/返回狀態。
- 12.15 那么到底會出什么問題?真的有什么系統不支持?void main()?嗎?
- 12.16 我一直用的那本書《熟練傻瓜C語言》總是使用?void main()。
- 12.17 從?main()?中, exit(status)?和返回同樣的?status?真的等價嗎?
- 12.18 我試圖用?ANSI ``字符串化"?預處理操作符?#?向信息中插入符號常量的值, 但它字符串化的總是宏的名字而不是它的值。
- 12.19 警告信息?``warning: macro replacement within astring literal"?是什么意思?
- 12.20 在我用?#ifdef?去掉的代碼里出現了奇怪的語法錯誤。
- 12.21 #pragma?是什么, 有什么用?
- 12.22 ``#pragma once"?是什么意思?我在一些頭文件中看到了它。
- 12.23 a[3] = "abc";?合法嗎?它是什么意思?
- 12.24 為什么我不能對?void*?指針進行運算?
- 12.25 memcpy()?和?memmove()?有什么區別?
- 12.26 malloc(0)?有什么用?返回一個控指針還是指向?0?字節的指針?
- 12.27 為什么?ANSI?標準規定了外部標示符的長度和大小寫限制?
- 12.28 我的編譯對最簡單的測試程序報出了一大堆的語法錯誤。
- 12.29 為什么有些?ASNI/ISO?標準庫函數未定義?我明明使用的就是?ANSI?編譯器。
- 12.30 誰有把舊的?C?程序轉化為?ANSI C?或相反的工具,或者自動生成原型的工具?
- 12.31 為什么聲稱兼容?ANSI?的?Frobozz Magic C?編譯器不能編譯這些代碼?我知道這些代碼是?ANSI?的, 因為?gcc?可以編譯。
- 12.32 人們好像有些在意實現定義?(implementation-defin-ed)、未明確?(unspecified)?和無定義?(undefined)?行為的區別。它們的區別到底在哪里?
- 12.33 一個程序的?``合法", ``有效"?或?``符合"?到底是什么意思?
- 12.34 我很吃驚, ANSI?標準竟然有那么多沒有定義的東西。標準的唯一任務不就是讓這些東西標準化嗎?
- 12.35 有人說?i = i++?的行為是未定義的, 但是我剛在一個兼容?ANSI?的編譯器上測試, 得到了我希望的結果。
- 13. 標準輸入輸出庫
- 13.1 這樣的代碼有什么問題?char c;while((c = getchar()) != EOF) ...
- 13.2 我有個讀取直到?EOF?的簡單程序, 但是我如何才能在鍵盤上輸入那個?``EOF"?呢?
- 13.3 為什么這些代碼?while(!feof(infp)) { fgets(buf, MAXLINE, infp); fputs(buf, outfp);}?把最后一行復制了兩遍?
- 13.4 我的程序的屏幕提示和中間輸出有時顯示在屏幕上, 尤其是當我用管道向另一個程序輸出的時候。
- 13.5 我怎樣不等待回車鍵一次輸入一個字符?
- 13.6 我如何在?printf?的格式串中輸出一個?'%'?我試過?\%, 但是不行。
- 13.7 有人告訴我在?printf?中使用?%lf?不正確。那么, 如果?scanf()?需要?%lf, 怎么可以用在?printf()?中用?%f?輸出雙精度數呢?
- 13.8 對于?size_t?那樣的類型定義, 當我不知道它到底是?long?還是其它類型的時候, 我應該使用什么樣的?printf?格式呢?
- 13.9 我如何用?printf?實現可變的域寬度?就是說, 我想在運行時確定寬度而不是使用?%8d?
- 13.10 如何輸出在千位上用逗號隔開的數字?金額數字呢?
- 13.11 為什么?scanf("%d", i)?調用不行?
- 13.12 為什么?char s[30];scanf("%s", s);?不用?&?也可以?
- 13.13 為什么這些代碼?double d;scanf("%f", &d);?不行?
- 13.14 怎樣在?scanf()?格式串中指定可變的寬度?
- 13.15 當我用?``%d\n"?調用?scanf?從鍵盤讀取數字的時候, 好像要多輸入一行函數才返回。
- 13.16 我用?scanf %d?讀取一個數字, 然后再用?gets()?讀取字符串, 但是編譯器好像跳過了?gets()?調用!
- 13.17 我發現如果堅持檢查返回值以確保用戶輸入的是我期待的數值,則?scanf()?的使用會安全很多, 但有的時候好像會陷入無限循環。
- 13.18 為什么大家都說不要使用?scanf()?那我該用什么來代替呢?
- 13.19 我怎樣才知道對于任意的?sprintf?調用需要多大的目標緩沖區?怎樣才能避免?sprintf()?目標緩沖區溢出?
- 13.20 為什么大家都說不要使用?gets()?
- 13.21 為什么調用?printf()?之后?errno?內有?ENOTTY?
- 13.22 fgetops/fsetops?和?ftell/fseek?之間有什么區別??fgetops()?和?fsetops()?到底有什么用處?
- 13.23 如何清除多余的輸入, 以防止在下一個提示符下讀入?fflush(stdin)?可以嗎?
- 13.24 既然?fflush()?不能, 那么怎樣才能清除輸入呢?
- 13.25 對某些路徑文件名調用?fopen()?總是失敗。
- 13.26 我想用?``r+"?打開一個文件, 讀出一個字符串, 修改之后再寫入,從而就地更新一個文件。可是這樣不行。
- 13.27 怎樣在程序里把?stdin?或?stdout?重定向到文件?
- 13.28 一旦使用?freopen()?之后, 怎樣才能恢復原來的?stdout(或?stdin)?
- 13.29 怎樣同時向兩個地方輸出, 如同時輸出到屏幕和文件?
- 13.30 怎樣正確的讀取二進制文件?我有時看到?0x0a?和?0x0d?混淆了,而且如果數據中包含?0x1a?的話, 我好像會提前遇到?EOF。
- 14. 庫函數
- 14.1 怎樣把數字轉為字符串?(與?atoi?相反)?有?itoa()?函數嗎?
- 14.2 為什么?strncpy()?不能總在目標串放上終止符?'\0'?
- 14.3 為什么有些版本的?toupper()?對大寫字符會有奇怪的反應?為什么有的代碼在調用?toupper()?前先調用?tolower()?
- 14.4 怎樣把字符串分隔成用空白作間隔符的段?怎樣實現類似傳遞給?main()?的?argc?和?argv?
- 14.5 我需要一些處理正則表達式或通配符匹配的代碼。
- 14.6 我想用?strcmp()?作為比較函數, 調用?qsort()?對一個字符串數組排序, 但是不行。
- 14.7 我想用?qsort()?對一個結構數組排序。我的比較函數接受結構指針,但是編譯器認為這個函數對于?qsort()?是錯誤類型。我要怎樣轉換這個函數指針才能避免這樣的警告?
- 14.8 怎樣對一個鏈表排序?
- 14.9 怎樣對多于內存的數據排序?
- 14.10 怎樣在?C?程序中取得當前日期或時間?
- 14.11 我知道庫函數?localtime()?可以把?time_t?轉換成結構?struct tm, 而?ctime()?可以把?time_t?轉換成為可打印的字符串。怎樣才能進行反向操作, 把?struct tm?或一個字符串轉換成?time_t?
- 14.12 怎樣在日期上加?N?天?怎樣取得兩個日期的時間間隔?
- 14.13 我需要一個隨機數生成器。
- 14.14 怎樣獲得在一定范圍內的隨機數?
- 14.15 每次執行程序,?rand()?都返回相同順序的數字。
- 14.16 我需要隨機的真/假值, 所以我用直接用?rand() % 2, 可是我得到交替的?0, 1, 0, 1, 0 ……
- 14.17 怎樣產生標準分布或高斯分布的隨機數?
- 14.18 我不斷得到庫函數未定義錯誤, 但是我已經?#inlude?了所有用到的頭文件了。
- 14.19 雖然我在連接時明確地指定了正確的函數庫, 我還是得到庫函數未定義錯誤。
- 14.20 連接器說?_end?未定義代表什么意思?
- 14.21 我的編譯器提示?printf?未定義!這怎么可能?
- 15. 浮點運算
- 15.1 一個?float?變量賦值為?3.1?時,為什么?printf?輸出的值為?3.0999999?
- 15.2 執行一些開方根運算, 可是得到一些瘋狂的數字。
- 15.3 做一些簡單的三角函數運算, 也引用了?#include<math.h>, 可是一直得到編譯錯誤?``undefined:sin"?(函數?sin 未定義)。
- 15.4 浮點計算程序表現奇怪, 在不同的機器上給出不同的結果。
- 15.5 有什么好的方法來驗對浮點數在?``足夠接近"?情況下的等值?
- 15.6 怎樣取整數?
- 15.7 為什么?C?不提供乘冪的運算符?
- 15.8 為什么我機器上的?<math.h>?沒有預定義常數?M_PI?
- 15.9 怎樣測試?IEEE NaN?以及其它特殊值?
- 15.10 在?C?中如何很好的實現復數?
- 15.11 我要尋找一些實現以下功能的程序源代碼:快速傅立葉變換?(FFT)、矩陣算術?(乘法、倒置等函數)、復數算術。
- 15.12 Turbo C?的程序崩潰, 顯示錯誤為?``floating point formatsnot linked" (浮點格式未連接)。
- 16. 可變參數
- 16.1 為什么調用?printf()?前, 必須要用?#include <stdio.h>?
- 16.2 為什么?%f?可以在?printf()?參數中, 同時表示?float?和?double?他們難道不是不同類型嗎?
- 16.3 為什么當?n?為?long int, printf("%d", n);?編譯時沒有匹配警告?我以為?ANSI?函數原型可以防止這樣的類型不匹配。
- 16.4 怎樣寫一個有可變參數的函數?
- 16.5 怎樣寫類似?printf()?的函數, 再把參數轉傳給?printf()?去完成大部分工作?
- 16.6 怎樣寫類似?scanf()?的函數, 再把參數轉傳給?scanf()?去完成大部分工作?
- 16.7 怎樣知道實際上有多少個參數傳入函數?
- 16.8 為什么編譯器不讓我定義一個沒有固定參數項的可變參數函數?
- 16.9 我有個接受?float?的可變參函數, 為什么?va_arg(argp, float)?不工作?
- 16.10 va_arg()?不能得到類型為函數指針的參數。
- 16.11 怎樣實現一個可變參數函數, 它把參數再傳給另一個可變參數函數?
- 16.12 怎樣調用一個參數在執行是才建立的函數?
- 17. 奇怪的問題
- 17.1 遇到不可理解的不合理語法錯誤, 似乎大段的程序沒有編譯。
- 17.2 為什么過程調用不工作?編譯器似乎直接跳過去了。
- 17.3 程序在執行用之前就崩潰了, 用調試器單步跟進, 在?main()?之前就死了。
- 17.4 程序執行正確, 但退出時崩潰在?main()?最后一個語句之后。為什么會這樣?
- 17.5 程序在一臺機器上執行完美, 但在另一臺上卻得到怪異的結果。更奇怪的是, 增加或去除調試的打印語句, 就改變了癥狀……
- 17.6 為什么代碼: char *p = "hello, worl!";p[0] = 'H'; 會崩潰?
- 17.7 ``Segmentation violation", ``Bus error"?和?``General protection fault"?意味著什么?
- 18. 風格
- 18.1 什么是?C?最好的代碼布局風格?
- 18.2 用?if(!strcmp(s1, s2))?比較兩個字符串等值,是否是個好風格?
- 18.3 為什么有的人用?if (0 == x)?而不是?if (x == 0)?
- 18.4 原型說明?extern int func __((int, int));?中, 那些多出來的括號和下劃線代表了什么?
- 18.5 為什么有些代碼在每次調用?printf()?前, 加了類型轉換?(void)?
- 18.6 什么是?``匈牙利標志法" (Hungarian Notation)?是否值得用?
- 18.7 哪里可以找到?``印第安山風格指南" (Indian Hill Style Guide)及其它編碼標準?
- 18.8 有些人說?goto?是邪惡的, 我應該永不用它。那是否太極端了?
- 19. 工具和資源
- 19.1 常用工具列表。
- 19.2 怎樣抓捕棘手的?malloc?問題?
- 19.3 有什么免費或便宜的編譯器可以使用?
- 19.4 剛剛輸入完一個程序, 但它表現的很奇怪。你可以發現有什么錯誤的地方嗎?
- 19.5 哪里可以找到兼容?ANSI?的?lint?
- 19.6 難道?ANSI?函數原型說明沒有使?lint?過時嗎?
- 19.7 網上有哪些?C?的教程或其它資源?
- 19.8 哪里可以找到好的源代碼實例, 以供研究和學習?
- 19.9 有什么好的學習?C?的書?有哪些高級的書和參考?
- 19.10 哪里可以找到標準?C?函數庫的源代碼?
- 19.11 是否有一個在線的?C?參考指南?
- 19.12 哪里可以得到?ANSI/ISO C?標準?
- 19.13 我需要分析和評估表達式的代碼。
- 19.14 哪里可以找到?C?的?BNF?或?YACC?語法?
- 19.15 誰有?C?編譯器的測試套件?
- 19.16 哪里有一些有用的源代碼片段和例子的收集?
- 19.17 我需要執行多精度算術的代碼。
- 19.18 在哪里和怎樣取得這些可自由發布的程序?
- 20. 系統依賴
- 20.1 怎樣從鍵盤直接讀入字符而不用等?RETURN?鍵?怎樣防止字符輸入時的回顯?
- 20.2 怎樣知道有未讀的字符, 如果有, 有多少?如果沒有字符,怎樣使讀入不阻斷?
- 20.3 怎樣顯示一個百分比或?``轉動的短棒"?的進展表示器?
- 20.4 怎樣清屏?怎樣輸出彩色文本?怎樣移動光標到指定位置?
- 20.5 怎樣讀入方向鍵, 功能鍵?
- 20.6 怎樣讀入鼠標輸入?
- 20.7 怎樣做串口?(``comm")?的輸入輸出?
- 20.8 怎樣直接輸出到打印機?
- 20.9 怎樣發送控制終端或其它設備的逃逸指令序列?
- 20.10 怎樣直接訪問輸入輸出板?
- 20.11 怎樣做圖形?
- 20.12 怎樣顯示?GIF?和?JPEG?圖象?
- 20.13 怎樣檢驗一個文件是否存在?
- 20.14 怎樣在讀入文件前, 知道文件大小?
- 20.15 怎樣得到文件的修改日期和時間?
- 20.16 怎樣縮短一個文件而不用清除或重寫?
- 20.17 怎樣在文件中插入或刪除一行?(或記錄)?
- 20.18 怎樣從一個打開的流或文件描述符得到文件名?
- 20.19 怎樣刪除一個文件?
- 20.20 怎樣復制一個文件?
- 20.21 為什么用了詳盡的路徑還不能打開文件??fopen("c:\?newdir?\file.dat","r")?返回錯誤。
- 20.22 fopen()?不讓我打開文件: "$HOME/.profile"?和?"~/?.myrcfile"。
- 20.23 怎樣制止?MS-DOS?下令人擔憂的?``Abort, Retry, Ignore?"?信息?
- 20.24 遇到?``Too many open files (打開文件太多)"?的錯誤, 怎樣增加同時打開文件的允許數目?
- 20.25 怎樣在?C?中讀入目錄?
- 20.26 怎樣找出系統還有多少內存可用?
- 20.27 怎樣分配大于?64K?的數組或結構?
- 20.28 錯誤信息?``DGROUP data allocation exceeds 64K (DGROUP數據分配內存超過?64K)"?說明什么?我應該怎么做?我以為使用了大內存模型, 那我就可以使用多于?64K?的數據!
- 20.29 怎樣訪問位于某的特定地址的內存?(內存映射的設備或圖顯內存)?
- 20.30 怎樣在一個?C?程序中調用另一個程序?(獨立可執行的程序,或系統命令)?
- 20.31 怎樣調用另一個程序或命令, 同時收集它的輸出?
- 20.32 怎樣才能發現程序自己的執行文件的全路徑?
- 20.33 怎樣找出和執行文件在同一目錄的配置文件?
- 20.34 一個進程如何改變它的調用者的環境變量?
- 20.35 怎樣讀入一個對象文件并跳躍到其中的地址?
- 20.36 怎樣實現精度小于秒的延時或記錄用戶回應的時間?
- 20.37 怎樣抓獲或忽略像?control-C?這樣的鍵盤中斷?
- 20.38 怎樣很好地處理浮點異常?
- 20.39 怎樣使用?socket? 網絡化? 寫客戶/服務器程序?
- 20.40 怎樣調用?BIOS?函數?寫?ISR?創建?TSR?
- 20.41 編譯程序, 編譯器出示?``union REGS"?未定義錯誤信息,連接器出示?``int86()"?的未定義錯誤信息。
- 20.42 什么是?``near"?和?``far"?指針?
- 20.43 我不能使用這些非標準、依賴系統的函數, 程序需要兼容?ANSI!
- 21. 雜項
- 21.1 怎樣從一個函數返回多個值?
- 21.2 怎樣訪問命令行參數?
- 21.3 怎樣寫數據文件, 使之可以在不同字大小、字節順序或浮點格式的機器上讀入?
- 21.4 怎樣調用一個由?char *?指針指向函數名的函數?
- 21.5 怎樣實現比特數組或集合?
- 21.6 怎樣判斷機器的字節順序是高字節在前還是低字節在前?
- 21.7 怎樣掉換字節?
- 21.8 怎樣轉換整數到二進制或十六進制?
- 21.9 我可以使用二進制常數嗎?有?printf()?的二進制的格式符嗎?
- 21.10 什么是計算整數中比特為?1?的個數的最有效的方法?
- 21.11 什么是提高程序效率的最好方法?
- 21.12 指針真得比數組快嗎?函數調用會拖慢程序多少??++i?比?i = i +1?快嗎?
- 21.13 人們說編譯器優化的很好, 我們不在需要為速度而寫匯編了, 但我的編譯器連用移位代替?i/=2?都做不到。
- 21.14 怎樣不用臨時變量而交換兩個值?
- 21.15 是否有根據字符串做切換的方法?
- 21.16 是否有使用非常量?case?標志的方法?(例如范圍或任意的表達式)?
- 21.17 return?語句外層的括號是否真的可選擇?
- 21.18 為什么?C?注釋不能嵌套?怎樣注釋掉含有注釋的代碼?引用字符串內的注釋是否合法?
- 21.19?C?是個偉大的語言還是別的?哪個其它語言可以寫象?a+++++b?這樣的代碼?
- 21.20 為什么?C?沒有嵌套函數?
- 21.21 assert()?是什么?怎樣用它?
- 21.22 怎樣從?C?中調用?FORTRAN (C++, BASIC, Pascal, Ada, LISP)的函數?反之亦然?
- 21.23 有什么程序可以做從?Pascal?或?Fortran?(或?LISP, Ada, awk,``老" C)?到?C?的轉換?
- 21.24 C++?是?C?的超集嗎?可以用?C++?編譯器來編譯?C?代碼嗎?
- 21.25 需要用到?``近似"?的?strcmp, 比較兩個字符串的近似度,并不需要完全一樣。
- 21.26 什么是散列法?
- 21.27 由一個日期, 怎樣知道是星期幾?
- 21.28 (year%4 == 0)?是否足夠判斷潤年?2000?年是閏年嗎?
- 21.29 一個難題: 怎樣寫一個輸出自己源代碼的程序?
- 21.30 什么是?``達夫設備" (Duff's Device)?
- 21.31 下屆國際?C?混亂代碼競賽?(IOCCC)?什么時候進行?哪里可以找到當前和以前的獲勝代碼?
- 21.32 [K&R1]? 提到的關健字?entry?是什么?
- 21.33 C?的名字從何而來?
- 21.34 ``char"?如何發音?
- 21.35 ``lvalue"?和?``rvalue"?代表什么意思?
- 21.36 哪里可以取得本?FAQ (英文版)?的額外副本?
- 22. 感謝
- 文獻