2011年3月21日 星期一

K&R2心得//型別、運算符號、運算式

翻譯問題
字串→字串常數
字元→字符常數、字元常數
動態變數→自動型變數(非自動型的變數前面有加static)
資料型態(Type)→型別
P.2-14  求得一個值,代表s[i]的字元→將求得在s[i]中之字符的數值




P.2-2
變數名稱
1. 字母開頭
    _(underline)視為字母
    用_為變數開頭,標準函式庫常用,使用者少用
2. 大小寫視為不同
3. 習慣上變數用小寫,而符號常數則用大寫
4. C語言至少可認識名稱的前31字符(不過還是因編譯器而異)
    函數名稱、外部變數名稱,因會被載入程式(loader)或組譯(assembler),能辨識的可能更短。(外部名稱只能保証前6個字符有效)
5. 內定關鍵字(小寫)不可用。

P.2-9
enum boolean{ NO, YES };
意思是
#define NO 0
#define YES 1

在此enum可以依序(預設初值為0)遞增,並且可以指定第一個定義為什麼值
enum month{ JAN = 1, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC };
意思是
#define JAN 1 //在此為1開始往後遞增
#define FEB 2
#define MAR 3

    ...
#define DEC 12

(不過不確定enmu是不是有宣告出記憶體,還是單純的替換文字而已)

P.2-8
靜態變數和外部變數,預設初值為0
一般變數(automatic)則無預設初值
const和static

算術運算:加(+)、減(-)、乘(*)、除商(/)、除餘數(%)、正號(+)、負號(-)
關係運算:大於(>)、大於等於(>=)、小於(<)、小於等於(<=)
邏輯運算:交集(&&)、聯集(||)、否定(!)
遞增、遞減運算:遞增(++)、遞減(--)(i++)
位元運算:and(&)、or(|)、xor(^)、左移(<<)、右移(>>)、not(~)

算術運算:
P.2-11
%不可用於float和double型態。
overflow:數字太大,位元無法容納,切掉了。
underflow:數字太小,位元解析度不足,忽略掉當作0了。

關係運算、邏輯運算
就是結果為0或1的運算

遞增、遞減運算
x = n++;
就是
x = n;
n = n+1;


x = ++n;

就是
n = n+1;
x = n;


不過n++和++n本身一樣,並沒有任何差別,差別只在於有等號出現時,先執行哪一個。

位元運算
AND(&)設定某些位元為1,可稱為「位元遮罩」
OR(|)設定某些位元為1
XOR(^)設定相對應位元不同值時為1
左移(<<)一定補0(無論是否為有號數還是無號數)
右移(>>)unsigned的值在右移一定補0
signed不一定,看編譯器
NOT(~)多bit數取相反值(1的補數)(與!不一樣,!是限定1bit取相反值

之後是算式改寫,目的:提高效率
設定運算式:
a = a + b ; → a += b ;
a = a - b ; → a -= b ;
a = a * b ; → a *= b ;
a = a / b ; → a /= b ;
a = a % b ; → a %= b ;


條件運算式:
if ( a > b )
    z = a ;
else
    z = b ;
    ↓
z =  ( a > b ) ? a : b ;


P.2-30
寫一個結果會取決於計算次序的程式是不好的習慣。
簡化語法的同時也要避免這問題。

沒有留言:

張貼留言