1.表示式的求值:
初始值: x = 1, y = 1 ,z = 1
求:++x || ++y && ++z
答: 從左到右順序依次求值, 1(true).
注意:因為||操作符的左運算元是true,所以沒有必要求值了.
事實上c語言肯定不會繼續求值 -- 有關規則,在按從左到右的順序對乙個邏輯表示式求值的時候,只要知道了它的實際結果,就不會對其餘部分求值.
這意味著y和z的值仍將是1.
ps. 邏輯操作符的***:c語言裡的邏輯表示式的求值有一定的難度,因為是否需要對邏輯操作符的右運算元求值取決於其左運算元的求值結果.如果右半部分隱藏了***,就會留下隱患,***可能也可能不發作.一般來說,謹慎對待***是沒錯的.
2.整數和浮點的轉換:
int i, long l, float f, double d;
求: i = l = f = d = 100/3.
printf("%.8g/n",i,l,f,d); //都以同樣格式輸出
答: 從右到左依次求值.
d = 33.333333 (double型)
f = 33.33333x (float型)
注意: "%.8g"最多輸出前8位數字,在intel 8086和motorola68000機器上,7位數字是float的精確度極限,第8位不可靠
l = 33 (長整形)
i = 33 (整數)
d= f = l = i =(double)100/3 注意: 型別轉換優先順序要高於"/"
所以
i= int(33.333333) = 33
3.預處理檔案
#include "defs.h"
在編譯程式的時候,預處理會把這條語句替換成defs.h中的內容,使得defs.h檔案裡的定義在這程式中生效.
4.程式設計風格
(1).if else巢狀的改善
5.儲存類
更多函式時變數儲存的分析:
看看上面這**輸出的是什麼,好好分析下!!!
結果:i = 1 j = 1
next(i) = 1
last(i) = 10
new(i+j) = 12
i = 1 j = 2
next(i) = 2
last(i) = 9
new(i+j) = 13
i = 1 j = 3
next(i) = 3
last(i) = 8
new(i+j) = 14
extern語句編譯器表明: i是乙個在其他地方(可能是另乙個檔案)定義的外部變數.
檔案開始就定義的變數: 對外部變數進行的定義.看似可能會跟別的外部同名變數相衝突,但如果在這變數前加個保留字static,它向編譯器表明:這個變數作用域僅限於本檔案
6.難解的指標
如果能正確的答對這道謎題,說明已經全面掌握了c語言裡的指標的用法,試試看吧!!!
結果:
c : 以char指標為元素的陣列(畫圖幫助理解)
cp: 以char指標的指標為元素的陣列
cpp: 指向乙個char指標的指標
指向 "point" 的指標即c[2]
指向 "enter"中"ter"的指標 即c[0]+3
指向 "first" 中 "st"的指標 即c[3]+3
指向 "new" 中 "ew"的指標 即c[1]+1
c語言小知識
1 為什麼include標頭檔案後,就可以呼叫檔案中宣告的函式了?標頭檔案中一般只是函式和變數的宣告,編譯器需要知道函式傳遞的是什麼引數,否則呼叫的地方 不知道如何設定暫存器和棧等一些相關資訊。至於函式的位置,由於在其他的編譯單元中,需要鏈結 時才能找到。標頭檔案中包含了函式的宣告,其具體的函式 即...
C語言小知識
nowcoder 牛客網 筆記 一 區域性變數與全域性變數 區域性變數不會影響全域性變數的值,使用完即會釋放 二 變數的傳遞 形參的修改對外部不影響 傳入引用與指標時在函式裡修改的將會傳遞出來 三 c語言與c 中的const void main 在c語言中結果為1,1 在c語言中const是執行時的...
C語言小知識
所有的轉義字元和所對應的意義 轉義字元 意義ascii碼值 十進位制 a響鈴 bel 007 b 退格 bs 將當前位置移到前一列 008 f 換頁 ff 將當前位置移到下頁開頭 012 n 換行 lf 將當前位置移到下一行開頭 010 r 回車 cr 將當前位置移到本行開頭 013 t 水平製表 ...