
- C程式設計教程
- C - 首頁
- C語言基礎
- C - 概述
- C - 特性
- C - 歷史
- C - 環境搭建
- C - 程式結構
- C - Hello World
- C - 編譯過程
- C - 註釋
- C - 詞法單元
- C - 關鍵字
- C - 識別符號
- C - 使用者輸入
- C - 基本語法
- C - 資料型別
- C - 變數
- C - 整數提升
- C - 型別轉換
- C - 型別強制轉換
- C - 布林值
- C語言中的常量和字面量
- C - 常量
- C - 字面量
- C - 轉義序列
- C - 格式說明符
- C語言中的運算子
- C - 運算子
- C - 算術運算子
- C - 關係運算符
- C - 邏輯運算子
- C - 位運算子
- C - 賦值運算子
- C - 一元運算子
- C - 自增和自減運算子
- C - 三元運算子
- C - sizeof 運算子
- C - 運算子優先順序
- C - 其他運算子
- C語言中的決策語句
- C - 決策語句
- C - if 語句
- C - if...else 語句
- C - 巢狀 if 語句
- C - switch 語句
- C - 巢狀 switch 語句
- C語言中的迴圈
- C - 迴圈
- C - while 迴圈
- C - for 迴圈
- C - do...while 迴圈
- C - 巢狀迴圈
- C - 無限迴圈
- C - break 語句
- C - continue 語句
- C - goto 語句
- C語言中的函式
- C - 函式
- C - 主函式
- C - 按值傳遞函式呼叫
- C - 按引用傳遞函式呼叫
- C - 巢狀函式
- C - 可變引數函式
- C - 使用者自定義函式
- C - 回撥函式
- C - 返回語句
- C - 遞迴
- C語言中的作用域規則
- C - 作用域規則
- C - 靜態變數
- C - 全域性變數
- C語言中的陣列
- C - 陣列
- C - 陣列的特性
- C - 多維陣列
- C - 將陣列傳遞給函式
- C - 從函式返回陣列
- C - 變長陣列
- C語言中的指標
- C - 指標
- C - 指標和陣列
- C - 指標的應用
- C - 指標運算
- C - 指標陣列
- C - 指向指標的指標
- C - 將指標傳遞給函式
- C - 從函式返回指標
- C - 函式指標
- C - 指向陣列的指標
- C - 指向結構體的指標
- C - 指標鏈
- C - 指標與陣列
- C - 字元指標和函式
- C - 空指標
- C - void 指標
- C - 懸空指標
- C - 解引用指標
- C - 近、遠和巨型指標
- C - 指標陣列的初始化
- C - 指標與多維陣列
- C語言中的字串
- C - 字串
- C - 字串陣列
- C - 特殊字元
- C語言中的結構體和聯合體
- C - 結構體
- C - 結構體和函式
- C - 結構體陣列
- C - 自引用結構體
- C - 查詢表
- C - 點(.)運算子
- C - 列舉(或列舉型別)
- C - 結構體填充和打包
- C - 巢狀結構體
- C - 匿名結構體和聯合體
- C - 聯合體
- C - 位域
- C - typedef
- C語言中的檔案處理
- C - 輸入和輸出
- C - 檔案 I/O(檔案處理)
- C 預處理器
- C - 預處理器
- C - 編譯指示
- C - 預處理器運算子
- C - 宏
- C - 標頭檔案
- C語言中的記憶體管理
- C - 記憶體管理
- C - 記憶體地址
- C - 儲存類別
- 其他主題
- C - 錯誤處理
- C - 可變引數
- C - 命令執行
- C - 數學函式
- C - static 關鍵字
- C - 隨機數生成
- C - 命令列引數
- C程式設計資源
- C - 問答
- C - 快速指南
- C - 速查表
- C - 有用資源
- C - 討論
C語言中的型別轉換
術語“型別轉換”是指將一種資料型別轉換為另一種資料型別。它也稱為“型別轉換”。在某些情況下,編譯器會自行執行轉換(隱式型別轉換),以便資料型別彼此相容。
在其他情況下,C編譯器會強制執行型別轉換(顯式型別轉換),這是由型別轉換運算子引起的。例如,如果要將“long”值儲存到簡單整數中,則可以將“long”型別轉換為“int”型別。
可以使用型別轉換運算子顯式地將值從一種型別轉換為另一種型別 -
(type_name) expression
示例 1
考慮以下示例 -
#include <stdio.h> int main() { int sum = 17, count = 5; double mean; mean = sum / count; printf("Value of mean: %f\n", mean); }
輸出
執行程式碼並檢查其輸出 -
Value of mean: 3.000000
雖然我們期望結果為 17/5,即 3.4,但它顯示為 3.000000,因為除法表示式中的兩個運算元都是 int 型別。
示例 2
在 C 語言中,除法運算的結果始終為位元組長度較大的資料型別。因此,必須將其中一個整數運算元強制轉換為 float 型別。
強制轉換運算子導致將一個整數變數除以另一個整數變數作為浮點運算執行 -
#include <stdio.h> int main() { int sum = 17, count = 5; double mean; mean = (double) sum / count; printf("Value of mean: %f\n", mean); }
輸出
編譯並執行上述程式碼時,會產生以下結果 -
Value of mean: 3.400000
這裡需要注意的是,強制轉換運算子優先於除法,因此 sum 的值首先轉換為 double 型別,最後除以 count,得到一個 double 值。
型別轉換可以是編譯器自動執行的隱式轉換,也可以透過使用強制轉換運算子顯式指定。在需要型別轉換時使用強制轉換運算子被認為是良好的程式設計實踐。
型別提升規則
在執行隱式或自動型別轉換時,C 編譯器遵循型別提升規則。通常,遵循的原則是 -
- 位元組和短整型 值 - 它們被提升為 int 型別。
- 如果一個運算元為 long 型別 - 整個表示式被提升為 long 型別。
- 如果一個運算元為 float 型別 - 整個表示式被提升為 float 型別。
- 如果任何一個運算元為 double 型別 - 結果被提升為 double 型別。
C語言中的整數提升
整數提升是將小於 int 或 unsigned int 的整數型別的值轉換為 int 或 unsigned int 的過程。
示例
考慮一個將字元與整數相加的示例 -
#include <stdio.h> int main() { int i = 17; char c = 'c'; /* ascii value is 99 */ int sum; sum = i + c; printf("Value of sum : %d\n", sum); }
輸出
編譯並執行上述程式碼時,會產生以下結果 -
Value of sum: 116
這裡,sum 的值為 116,因為編譯器正在執行整數提升並將 'c' 的值轉換為 ASCII 碼,然後執行實際的加法運算。
通常的算術轉換
通常的算術轉換不適用於賦值運算子,也不適用於邏輯運算子 && 和 ||。
示例
讓我們以以下示例來理解這個概念 -
#include <stdio.h> int main() { int i = 17; char c = 'c'; /* ascii value is 99 */ float sum; sum = i + c; printf("Value of sum : %f\n", sum); }
輸出
編譯並執行上述程式碼時,會產生以下結果 -
Value of sum: 116.000000
這裡,很容易理解首先 c 被轉換為整數,但是由於最終值為 double 型別,因此應用了通常的算術轉換,編譯器將 i 和 c 轉換為 'float' 型別並相加,得到一個 'float' 型別的結果。