C語言自動類型轉換:int型數據 + float數據 → double型?糾正教材中的錯誤用法!

      網友投稿 1387 2022-05-25

      目錄

      前言

      一、官方標準證明(C89、C99、C11)

      二、代碼證明

      三、一些教材上的錯誤的用法來源 與 K&R(非正式)標準

      四、參考博文

      五、C語言各個版本PDF下載

      前言

      筆者之前看到一些教材關于自動類型轉換章節的知識點寫到:1.float型數據參與運算時,先轉換為double型數據再計算;2.float型數據 與 int型數據運算,先將兩者轉換為double型,再運算。與筆者的實操結果不符,于是經過充分的查閱后,發現上述知識點已經是30年前過時老掉牙的用法了。今天筆者通過官方標準、代碼證明、錯誤來源 來充分證明。

      一、官方標準證明(C89、C99、C11)

      距今為止,C語言官方標準共發展了四代:C89、C99、C11、C17

      C89、C99、C11這三代標準中均對于float + float → float 、 int + float → float 作出了明確說明。由于筆者暫未找到C17官方標準文檔,再加之C17相較于C11未發生語法改動,因此本文暫不作C17標準的討論。

      1.C89

      首先,C89是由美國國家標準協會(ANSI)在 1989年正式公布的標準,該標準定義了C語言和C標準庫。

      p.s:

      國際標準化組織(ISO)采用了這套C標準,因此ISO C和ANSI C是完全相同的標準。

      ANSI于1989年批準該標準,因此通常稱之為C89。

      ISO于1990年批準該標準,因而又有C90的叫法。

      C89標準中的6.2.1.5章節中有說明:float + float → float 、 int + float → float。如下:

      由于我國的C標準采用的是此版本,所以相當于C89的官方中文翻譯版。

      2.C99

      在后來1999年出臺的C99標準中關于float + float →float、 int + float → 的規定并無變化。(翻譯放在英文原文的下方)

      3.C11

      2011年出臺的C11標準中6.3.1.8章節中自動類型轉換的規定與C99標準的此部分規定完全一致:

      綜上,C89、C99、C11標準中對于float + float → float、 float + int → float 的說明都是一樣的。

      因此,自動類型轉換規則應該是下圖這樣的:(C99標準的unsigned與long的混合情況暫不重要 不討論- -)僅供參考歡迎補充

      二、代碼證明

      編譯器為DEV C++,采用標準為C99。

      測試代碼如下:

      /* 編譯器:DEV C++ 采用標準:C99 */ #include int main() { // 1. int + float →float 而不是 int + float →double int int_a = 1; float float_a = 2.5; printf("%f\n",int_a + float_a); //3.500000 printf("%d",sizeof(int_a + float_a)); //4 // 備注:第一個printf結果為3.500000說明int轉為了實型,而非float轉為了int。與爭議點無關,僅供自己測試 。 // 第二個printf結果為4說明int轉為了float(4字節),而非int和float都轉為了double(8字節) // 2.float + float →float 而不是 float + flaot →double float float_b = 1.5; printf("%f\n",float_a + float_b); //4.000000 printf("%d\n",sizeof(float_a + float_b)); //4 // 備注:第一個printf結果為4.000000,與本次話題無關,僅供自己測試 。 // 第二個printf結果為4說明int轉為了float(4字節),而非int和float都轉為了double(8字節) //======================以下三點為補充測試======================== // 3. char + short → int 而不是 char + short →short char char_a = 1 ; short short_a = 1; printf("%d,%d\n",sizeof(char_a),sizeof(short_a)); // 1,2 printf("%d\n",sizeof(char_a + short_a)); //4 // 備注:char 1字節 ,short 2字節 , 此例說明char + short 運算,都轉為了int // 4. long + float → float 而不是 long + float →double long long_a = 1; // float_a在例1中已定義 printf("%f\n",long_a + float_a); //3.500000 printf("%d\n",sizeof(long_a + float_a)); //4 // 備注:第一個printf結果為3.500000說明long轉為了實型,而非float轉為了long 。與爭議點無關,僅供自己測試 。 // 第二個printf結果為4說明long轉為了float(4字節),而非long和float都轉為了double(8字節) // 5.double + float →double double double_a = 1.5; printf("%f\n",double_a + float_a); //4.000000 printf("%d\n",sizeof(double_a + float_a)); //8 // 備注:第一個printf結果為4.000000,與本次話題無關,僅供自己測試 。 // 第二個printf結果為4說明int轉為了float(4字節),而非int和float都轉為了double(8字節) }

      C語言自動類型轉換:int型數據 + float數據 → double型?糾正教材中的錯誤用法!

      三、一些教材上的錯誤的用法來源 與 K&R(非正式)標準

      float + float → double,int + float → double的用法來源于由C語言設計者丹尼斯·里奇于1978 年出版的《The C Programming Language》第 1 版。筆者暫未找到第一版的資源。

      此時的 C 語言還沒有統一的標準,來自C語言之父的《The C Programming Language》第 1 版可算作“正式”的標準,所以此時的 C 也稱為“K&R” C。

      當時的教材就是根據這本書作為標準而編寫的。

      10年后的1988年,C語言之父丹尼斯·里奇出版了《The C Programming Language》第 2版(如下面的四張圖),書中將原用法更改為float + float → float , int + float → float 。(原文:修改了“普通算術類型轉換”,特別地,“整型總是轉換為unsigned 類型,浮點數總是轉換為 double 類型”已更改為“提升到最小的足夠大的類型”。)

      1989年,考慮到標準化的重要,ANSI(American National Standards Institute)制定了第一個 C 標準,在1989年被正式采用(American National Standard X3.159-1989),故稱為 C89,也稱為 ANSI C。

      該標準隨后被 ISO 采納,成為國際標準(ISO/IEC 9899:1990)。

      最后,筆者想吐槽一句:30多年前早已被廢棄的用法,這都1202年了,一些教材居然還不修改 ~~

      四、參考博文

      1. 出現矛盾:c語言中float會自動轉換為double? - 知乎

      https://www.zhihu.com/question/51829080/answer/1219171602

      2.C語言標準—C89、C99、C11、C17、C2x ...

      https://blog.csdn.net/lu_embedded/article/details/115535432

      3.C2x將成為C語言的下一個ISO標準?:

      https://blog.csdn.net/cpongo4/article/details/89030403

      4.c語言之標準(K&RC 、c89、c99、c11)

      https://blog.csdn.net/qq_31029351/article/details/53290990

      5.如何使DEV C++支持C99標準?

      https://blog.csdn.net/qq_40834200/article/details/104714963

      五、C語言標準各個版本PDF下載

      【阿里云盤】

      https://www.aliyundrive.com/s/ZfaViMu1Xru

      【百度網盤】

      鏈接:https://pan.baidu.com/s/1g6nrTMWUtWr-6VdzGeAjMw

      提取碼:1234

      --來自百度網盤超級會員V1的分享

      C 語言

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:最新華為服務器使用指南2020.3.17-3.31
      下一篇:為什么建議大家使用 Linux 開發?
      相關文章
      亚洲香蕉网久久综合影视| 亚洲欧美日韩中文高清www777| 337P日本欧洲亚洲大胆艺术图 | 亚洲精品一级无码中文字幕 | 亚洲国产二区三区久久| 亚洲av永久无码精品表情包| 亚洲精品成人片在线观看精品字幕 | 久久亚洲AV成人出白浆无码国产 | 亚洲狠狠婷婷综合久久| 亚洲精品无码少妇30P| 亚洲人成网站在线在线观看| 亚洲人成网站999久久久综合| 亚洲国产精品成人综合色在线| 亚洲第一成年免费网站| 内射无码专区久久亚洲| 亚洲精品和日本精品| 黑人大战亚洲人精品一区| 亚洲国产美女精品久久久久∴| 亚洲av中文无码乱人伦在线咪咕| 久久亚洲成a人片| 亚洲高清无在码在线电影不卡| 亚洲精品免费在线| 中文字幕亚洲综合小综合在线 | 亚洲日韩国产二区无码| 日韩国产欧美亚洲v片| 亚洲成A人片在线观看中文| 2048亚洲精品国产| 亚洲国产精品无码av| 亚洲日本中文字幕区| 亚洲人成在线精品| 亚洲国产AV一区二区三区四区| 国产亚洲精品91| 亚洲中文字幕无码一久久区| 久久精品国产精品亚洲艾草网| 中文字幕亚洲综合久久2| 亚洲综合色7777情网站777| 亚洲精华国产精华精华液| 亚洲日韩VA无码中文字幕| 国产V亚洲V天堂A无码| 亚洲欧洲视频在线观看| 亚洲欧美日韩国产成人|