C部分疑惑 updating

2021-10-05 09:30:50 字數 3273 閱讀 2251

關係運算子的優先順序比算術運算子(包括+和-)低,比賦值運算子高。

這意味著x > y + 2和x > (y+ 2)相同,x = y > 2和x = (y > 2)相同。換言之,如果y大於2,則給x賦值1,否則賦值0。y的值不會賦給x。

求絕對值函式 abs fabs ,需要包含標頭檔案 math.c

關於睡眠函式和隨機數函式

睡眠函式 sleep,需要包含標頭檔案 #include

隨機數函式rand(),需要包含標頭檔案 #include , 還需要播種子,具體實現如下

1)unsigned int seed;

srand(seed); // 隨機數種子

printf("%d\n", rand()%10+1); // 1-10的隨機數

2)需要多增加乙個 的標頭檔案

srand((unsigned)time(null));

printf("%d\n", rand()%3+1); // 1-3的隨機數

逗號運算子的一些性質

逗號運算子有兩個其他性質。首先,它保證了被它分隔的表示式從左往右求值(換言之,逗號是乙個序列點,所以逗號左側項的所有***都在程式執行逗號右側項之前發生)。因此,ounces在cost之前被初始化。在該例中,順序並不重要,但是如果cost的表示式中包含了ounces時,順序就很重要。

例如,假設有下面的表示式:

ounces++, cost = ounces * first_oz

在該表示式中,先自增ounces,然後在第二個子表示式中使用onuces新值。作為序列點的逗號保證了左側子表示式的***在對右側子表示式求值之前發生。

其次 整個逗號表達的值是右側的值,就好像 a = (i++,i++),肯定是先把i自增一次,再把i自增一次,最後把自增兩次的結果賦給 a

逗號運算子賦值:

i = 299,500;

printf("%d\n", i); // i的值是299

先運算逗號左側表示式,等逗號左側表示式的***運算完,再運算右側表示式,所以 i = 299

i = (299,500);

printf("%d\n", i); // i的值是500

整個逗號表達的值是右側的值。()的優先順序高於 , 因此先將括號內運算完,再賦值,就好像 a = (i++,i++),先運算括號中i++,先把i自增一次,再把i自增一次,等括號運算完後,再把自增兩次的結果賦給 a

5. 關於scanf函式的返回值

scanf函式的返回值,是根據一次成功的資料來決定的,如果一次讀取兩個資料則返回2

printf("%d\n",scanf("%d%d%d",&i, &j, &k))

輸入 1 2 3 則scanf的返回值是 3

輸入1 2 q 則scanf的返回值是 2

輸入 1 q 2則返回值是1,在讀取到第二個是q的是時候,不符合%d,scanf函式就已經結束,不會再去判斷後面乙個數輸入的正確性(如果是換行輸入觀察就比較明顯了,在輸入第二個q字元的時候,直接返回)

因此在scanf函式當做while的迴圈條件時,盡量寫成 while(scanf("%d%d%d",&i, &j, &k) == 3) 這種形式

特殊字元處理函式,包含標頭檔案:#include

字元測試函式 如果是以下條件為真,否則為假

isalpha(ch) 字母

isalnum(ch) 字母或數字

isspace(ch) 指代所有的空白符,(包括空格』 『、水平製表符』\t』、換行符』\n』、垂直製表符』\v』、換頁』\f』以及回車』\r』)

isblank(ch) 標準空白符(這樣的空白符只有空格 』 '和水平製表符 『\t』)不能換行換頁,或者有其它特殊效果

iscntrl(ch) 控制字元(ctrl+b等)

isdigit(ch) 數字

isgraph(ch) 除空格之外任意可列印字元

islower(ch) 小寫字母

isupper(ch) 大寫字母

isprint(ch) 可列印字元

ispunct(ch) 標點符號(除空格、字母、數字以外的任意可列印字元)

字元對映函式 行為

tolower(ch) 如果是大寫字母則轉化為小寫字母,否則返回原始引數 putchar(tolower(ch));

toupper(ch) 如果是小寫字母則轉化為大寫字母,否則返回原始引數 putchar(toupper(ch));

7. c99新標準中,可以用 and 代替 && or 代替 || not 代替 !,需要包含標頭檔案:#include

8. 關於標誌位

記錄一句話中的單詞數目

在讀取到不是空白符號的時候記錄status的值的true,再次讀到空格或者標點符號的時候計數+1,同時將status的值置false,關於true,false需要包含標頭檔案 #include (為bool、true、false提供定義)

char ch;

_bool status = false;

while(』|』 != (ch = getchar()))

}9. 檔案讀取結束標誌:eof

這裡關鍵要理解eof是乙個值,標誌著檢測到檔案結尾,並不是在檔案中找得到的符號,eof的實際值是-1

int main()

注意:10. 不用定義eof,因為stdio.h中已經定義過了;

11. 不用擔心eof的實際值,因為eof在stdio.h中用#define預處理指令定義,可直接使用,不必再編寫**假定eof為某值;

12. 變數ch的型別從char變為int,因為char型別的變數只能表示0~255的無符號整數,但是eof的值是-1。還好,getchar()函式實際返回值的型別是int,所以它可以讀取eof字元。如果實現使用有符號的char型別,也可以把ch宣告為char型別,但最好還是用更通用的形式;

13. 由於getchar()函式的返回型別是int,如果把getchar()的返回值賦給char型別的變數,一些編譯器會警告可能丟失資料;

14. ch是整數不會影響putchar(),該函式仍然會列印等價的字元;

15. 使用該程式進行鍵盤輸入,要設法輸入eof字元。不能只輸入字元eof,也不能只輸入-1(輸入-1會傳送兩個字元:乙個連字元和乙個數字1)。正確的方法是,必須找出當前系統的要求。例如,在大多數unix和linux系統中,在一行開始處按下ctrl+d會傳輸檔案結尾訊號。許多微型計算機系統都把一行開始處的ctrl+z識別為檔案結尾訊號,一些系統把任意位置的ctrl+z解釋成檔案結尾訊號。

16. 初始化有陣列名的陣列可以省略大小,同樣初始化復合字面量也可以省略大小

int a[2] = <==> int a =

(int [2]) <==> (int )

C語言疑惑

c語言 存款預算 假設銀行一年整存零取的月息為1.875 現在某人手頭有一筆錢,他打算在今後5年中,每年年底取出1000元作為孩子來年的教育金,到第5年孩子畢業時剛好取完這筆錢,現在算一算第1年年初時他應存入銀行多少錢?define rate 0.225 rate 12 1.875 intmain ...

c指標 2個疑惑。

先註明,寫給自己看的。1.include include int main ptr printf d ptr return 0 剛剛看這樣的題目,感覺蠻簡單的。ptr定義指向了 m array的首位址,char型別1位元組。乙個int4個位元組 ptr 後,指標ptr的值加上1乘sizeof int...

C 型別轉換小疑惑

從執行結果來看,i和i2的值是一樣的。p是指向字串,p列印的是p的位址 int i int a 這個是將 a 的結果轉換為int型別。因為字串的返回值是其首位址,也就是我們將字串 a 的首位址做轉化,轉為為int型,而i2是將p做強制型別轉換,轉換為int並列印,因為p的內容就是字串 a 的首位址,...