[英]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的類型,而不更改類型域。
答案:
這是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.