13.07.2015 Views

PDF檔講義

PDF檔講義

PDF檔講義

SHOW MORE
SHOW LESS
  • No tags were found...

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

再 談 C 語 言 的 運 算 子P.C. Lin


運 算 子 的 種 類•C 語 言 除 了 加 (+) 運 算 子 之 外 還 有 其 他 許多 的 運 算 子 , 運 算 子 由 一 個 、 兩 個 、 或 三個 特 殊 字 元 結 合 而 成 , 用 於 表 示 某 一 種 運算 , 也 用 於 某 些 值 的 轉 換 或 指 定 。 有 些 運算 子 由 兩 個 以 上 特 殊 符 號 所 構 成 ,C 語 言仍 將 它 看 成 是 一 個 符 號 , 稱 為 符 記(token)。 例 如 「


C 語 言 的 運 算 子 列 表運 算 子 名 稱 運 算 子 名 稱------ -------------- --------- -----------------! 邏 輯 NOT < 小 於!= 不 相 等 右 移*= 乘 後 指 定 值 >>= 右 移 後 指 定 值+ 正 號 或 相 加 ?: 條 件++ 增 值 一 [ ] 陣 列 註 標+= 相 加 後 指 定 值 ^ 位 元 XOR 互 斥 或, 順 序 值 ^= 位 元 XOR 後 指 定 值- 負 號 或 相 減 defined 檢 查 巨 集 是 否 定 義-- 減 值 一 sizeof 計 算 運 算 元 的 大 小-= 減 後 指 定 值 | 位 元 OR-> 結 構 指 標 偏 移 值 |= 位 元 OR 後 指 定 值. 選 結 構 中 的 成 員 || 邏 輯 OR/ 相 除 ~ 位 元 補 數/= 相 除 後 指 定 值


C 語 言 的 運 算 子 列 表• 從 上 表 可 以 看 出 , 有 些 運 算 子 是 單 獨 和 運 算 元 搭配 的 , 例 如 「+」、「-」、「!」、「++」、「--」 等 運 算 子 , 稱 為 一 元 (unary) 運 算 子 。 有 些 運算 子 是 和 兩 個 運 算 元 搭 配 的 , 例 如 「+」、「-」、「*」、「/」、「%」 等 運 算 子 , 稱 為 二 元(binary) 運 算 子 。 有 些 運 算 子 是 和 三 個 運 算 元搭 配 的 , 例 如 「?:」 運 算 子 , 稱 為 三 元(ternary) 運 算 子 。• 123 - 45 /*「-」 為 二 元 運 算 子 */• -45 /*「-」 為 一 元 運 算 子 */• 123>45?1:0 /*「?:」 為 三 元 運 算 子 */


opr.c


算 術 運 算 子 範 例 expr.c


算 術 運 算• 算 術 運 算 包 括 :加 「+」減 「-」乘 「*」除 「/」餘 數 「%」等 五 個 運 算 子 , 其 操 作 想 必 都 耳 熟 能 詳 ,不 必 多 作 解 釋 , 就 以 一 個 簡 單 的 程 式 expr.c說 明 。


輸 出 % 符 號• 執 行 的 結 果 要 特 別 說 明 的 是 最 後 一 項 「123%45=33」,因 為 「%」 已 經 被 C 語 言 訂 為 格 式 字 串 的 前 導 符 號 了 , 要輸 出 它 時 要 特 別 處 理 , 以 兩 個 百 分 符 號 表 示 一 個 百 分 比 ,即 「%%」, 算 是 C 語 言 的 特 別 處 理 了 。 如 下 圖 所 示 。


指 定 運 算 子• 指 定 運 算 子 我 們 前 面 已 經 用 過 了 , 就 是 等號 「=」, 它 將 右 邊 運 算 式 的 值 指 定 給 左 邊的 變 數 。 但 它 可 與 一 些 運 算 子 相 結 合 成 一種 稱 為 複 合 指 定 運 算 子 。


複 合 指 定 運 算 子 表符 號 名 稱 說 明---- ------------------ -----------------------+= 加 複 合 指 定 運 算 子 a+=2; 相 當 於 a=a+2;-= 減 複 合 指 定 運 算 子 a-=2; 相 當 於 a=a-2;*= 乘 複 合 指 定 運 算 子 a*=2; 相 當 於 a=a*2;/= 除 複 合 指 定 運 算 子 a/=2; 相 當 於 a=a/2;%= 餘 數 複 合 指 定 運 算 子 a%=2; 相 當 於 a=a%2;2;&= 位 元 AND 指 定 運 算 子 a&=2; 相 當 於 a=a&2;|= 位 元 OR 指 定 運 算 子 a|=2; 相 當 於 a=a|2;^= 位 元 XOR 指 定 運 算 子 a^=2; 相 當 於 a=a^2;


複 合 運 算 子• 上 述 的 複 合 指 定 運 算 子 , 在 指 定 數 值 給 變數 之 前 先 進 行 一 次 運 算 , 例 如 「+=」 這 個複 合 指 定 運 算 子 , 就 會 先 執 行 加 法 運 算後 , 再 將 結 果 指 定 給 左 邊 的 變 數 。int a=3;a += 2; /* 將 a+2=3+2=5 指 定 給 a, 新 a 值 為 5*/• 因 為 它 將 加 法 運 算 與 指 定 的 工 作 集 合 與 一身 , 故 稱 為 複 合 運 算 子 。


compound.c


資 料 的 轉 型自 動 轉 型強 迫 轉 型


自 動 及 強 迫 轉 型• 我 們 在 設 定 變 數 初 值 時 , 初 值 的 資 料 型 態 若 與 變數 的 資 料 型 態 不 符 , 例 如 您 宣 告 一 個 變 數 如 下 :float f = 365;設 定 的 變 數 f 屬 於 單 精 度 浮 點 數 , 但 您 給 它 的 初值 卻 是 整 數 365,C 編 譯 器 會 將 365 整 數 轉 變 為365.0F 浮 點 數 後 再 指 定 給 變 數 f, 這 種 指 定 稱 為自 動 轉 型 , 由 整 數 型 態 自 動 轉 成 浮 點 數 型 態 。• 反 之 也 相 同 :int i = 12.3;由 12.3 浮 點 數 型 態 自 動 轉 成 整 數 型 態 數 值 12,再 指 定 給 變 數 i。


自 動 及 強 迫 轉 型• 目 的 型 態 的 容 量 若 較 來 源 型 態 大 , 可 完 全接 收 , 不 會 丟 失 資 料 , 但 若 目 的 型 態 的 容量 較 來 源 型 態 小 , 則 會 丟 失 來 源 變 數 高 位元 組 的 資 料 。 如 autocast.c , 來 源 為 短 整 數snum, 佔 2 個 位 元 組 , 其 值 為 65535, 指定 給 佔 4 個 位 元 組 的 整 數 inum, 容 量 較 大將 65535 完 整 接 收 沒 有 問 題 ; 但 指 定 給 只佔 1 個 位 元 組 的 字 元 變 數 cnum, 因 為 容 量較 小 , 因 此 丟 失 高 位 元 組 的 資 料 , 只 接 收一 個 位 元 組 的 資 料 , 其 值 255。


autocast.c


強 迫 轉 型• 自 動 轉 型 屬 於 隱 藏 形 的 轉 型 , 另 一 種 屬 於 強 迫 轉 型 , 在 運算 式 之 前 用 小 括 號 括 起 來 , 其 內 註 明 欲 轉 型 的 資 料 型 態 。• 強 迫 轉 型 格 式 如 下 :( 資 料 型 態 ) 運 算 式• 強 迫 轉 型 通 常 用 於 由 容 量 較 大 的 運 算 式 轉 型 至 容 量 較 小 的變 數 。• 如 下 列 cast.c 程 式 , 圓 直 徑 為 整 數 變 數 d, 要 將 它 轉 型 至倍 精 度 浮 點 數 變 數 r 時 , 強 迫 轉 型 如 下 :r = (double)d/2;如 此 d 轉 為 1.0 浮 點 數 後 再 除 於 2, 得 到 半 徑 r 的 值0.5, 再 行 計 算 面 積 a=PI*r*r, 最 後 將 直 徑 d 及 圓 面 積 a輸 出 。


cast.c


運 算 子 的 優 先 順 序• 算 術 四 則 運 算 的 規 則 是 先 乘 除 後 加 減 , 表 示 運 算子 是 有 優 先 順 序 的 , 乘 除 優 先 於 加 減 , 那 其 他 的運 算 子 又 如 何 呢 ? 請 看 下 表 。• 乘 除 運 算 子 的 優 先 順 序 為 3, 加 減 運 算 子 的 優 先順 序 為 4, 數 字 低 者 其 優 先 順 序 較 高 , 因 此 小 括號 的 優 先 順 序 為 1 是 所 有 運 算 子 裡 最 優 先 的 運 算子 。 相 同 優 先 順 序 的 運 算 子 要 看 其 結 合 順 序 才 能決 定 , 例 如 乘 除 運 算 子 的 優 先 順 序 均 為 3, 其 結合 規 則 從 左 至 右 , 因 此 左 邊 的 較 優 先 。 加 減 也 是一 樣 , 左 邊 的 較 優 先 。


運 算 子 優 先 順 序 表優 先 符 號 運 算 種 類 結 合---- ---------------------- ------------- ------1 ( ) [ ] -> . 運 算 式 左 至 右2 ! ~ ++ ---( 運 算 元 ) 一 元 運 算 子 右 至 左* & sizeof3 * / % 乘 / 除 / 餘 數 左 至 右4 + - 加 / 減 左 至 右5 > 左 移 / 右 移 左 至 右6 < >= 關 係 運 算 子 左 至 右7 == != 關 係 運 算 子 左 至 右8 & 位 元 AND 左 至 右9 ^ 位 元 XOR 左 至 右10 | 位 元 OR 左 至 右11 && 邏 輯 AND 左 至 右12 || 邏 輯 OR 左 至 右13 ?: 條 件 運 算 子 右 至 左14 = += -= *= /= %= 指 定 運 算 子 右 至 左= &= |= ^=15 , 循 序 計 值 左 至 右


運 算 子 的 優 先 順 序• int a=123, b=45, c=6, d, e;d = a - b + c; /*d=123-45+6=78+6=84*/e = a / b * c;/*e=123/45*6=2*6=12*/上 面 的 式 子 求 d 的 值 , 先 計 算 a-b=123-45=78, 再 加 6, 得 84。 因 為 「-」 與 「+」 同序 , 左 邊 的 優 先 執 行 。 求 e 值 時 也 是 一 樣 , 先 計算 123/45=2( 整 數 除 法 ), 再 乘 於 6, 得 結 果 為12。

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!