簡體   English   中英

無明顯類型的C表達式的評價

[英]Evaluation of an Expression in C Without an Explicit Type

考慮以前關於C的論文中的以下問題:

逐步顯示如何計算以下C表達式,給出表達式的值和該類型

 9 / 3 / 2 * 6 + 2 * 1.5 

類型是浮點數還是雙精度數? 有人可以澄清一下嗎? (注意問題中缺少明確的類型。)

根據通常的算術轉換 (6.3.1.8常用算術轉換)

否則,如果任一操作數的對應實數類型為double ,則將另一個操作數轉換為對應的實類型為double的類型,而不更改類型域。

答案:

  1. 9/3 = 3(int)
  2. 3/2 = 1(int)
  3. 1 * 6 = 6(int)
  4. 2 * 1.5 = 3.0(雙)
  5. 6 + 3.0 = 9.0(雙)

在你的表達式中, 1.5是一個double (為了讓編譯器將它視為一個float它應該有一個f后綴: 1.5f )。 所有其他數字都是int類型。

為了展示如何評估9/3/2 9 / 3 / 2 * 6 + 2 * 1.5表達式,請查看C運算符優先級以供參考(優先級和關聯性)。 請注意, 2 * 1.5將是double類型(因此整個表達式的類型)。

這是double

正如Kernighan&Ritchie的“The C programming language”中所提到的:

浮點常量包含小數點(123.4)或指數(1e-2)或兩者; 他們的類型是雙倍的,除非加上后綴。

快速找到自己的方法也就是編寫代碼: printf("%d %d\\n", sizeof(1.5)==sizeof(double), sizeof(1.5)==sizeof(float)); 這將輸出1 0表示1.5是雙倍。

編輯:當然,C中的類型大小取決於系統,因此代碼不應完全受信任。

通過利用基於反射的方法也可以解決該問題。 可以使用__builtin_types_compatible_p()將表達式的類型與float進行比較,然后使用double進行比較。 此函數確定兩種類型是否相同。 為此, __typeof__可以方便地檢索表達式的類型並將其傳遞給內置函數,如下所示:

#include <stdio.h>

int main() {
    if (__builtin_types_compatible_p(__typeof__(9 / 3 / 2 * 6 + 2 * 1.5), float)) {
        puts("float");
    } else if (__builtin_types_compatible_p(__typeof__(9 / 3 / 2 * 6 + 2 * 1.5), double)) {
        puts("double");
    }
    return (0);
}

演示

當類型相同時,函數返回1; 在這里看到更多。

注意: __typeof__不返回字符串,而是返回系統類型。

可以簡單地傳遞1.5而不是將整個數學表達式提供給typeof ,因為問題確實打開了什么數據類型代表這個浮點值。

請參閱相關信息: C11中_Generic的語法和示例用法

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM