簡體   English   中英

C 表達式的計算順序是什么

[英]What is the order in which C expressions are evaluated

int main(){
 char a = 5;
 float b = 6.0;
 int c = a + b;
 return c;
}

用gcc查看生成指令,上面的代碼是這樣評估的:

  • 負載5,並將其轉換為float作為a
  • 加載 6 作為b
  • 添加ab
  • 將結果轉換為整數並返回

gcc 在處理表達式時不關心返回類型嗎? 它可以立即將b轉換為int ,因為其他所有內容都是整數類型。

是否有規則可以解釋如何首先評估表達式的一側而不管另一側是什么?

你問“有規定嗎?” 當然是有規律的。 任何廣泛使用的編程語言都會有一套龐大的規則。

你有一個表達式“a + b”。 a 有 char 類型,b 有 float 類型。 C 語言中有一個規則,編譯器必須找到一個公共類型並將兩者都轉換為公共類型。 由於其中一個值是浮點類型,因此公共類型必須是浮點類型,即 float、double 或 long double。 如果您仔細查看規則,就會發現公共類型必須是 float 或 double,並且編譯器必須記錄這一點。 似乎編譯器選擇了“float”作為通用類型。

所以a從char轉換為float,b已經是float,兩者相加,結果為float類型。 然后有一個規則,要將 float 分配給 int,根據非常具體的規則進行轉換。

任何 C 編譯器都必須嚴格遵守這些規則。 有一個例外:如果編譯器可以生成它應該生成的結果,那么如何生成都無關緊要。 只要你不能從外面區分它。 所以編譯器可以把整個代碼改成“return 11;”。

在 C 語言中,部分表達式的計算不考慮它們以后如何使用。 無論 a+b 是否分配給 int、char、double,它總是以相同的方式計算。 還有其他具有不同規則的語言,其中將 a+b 分配給 int 的事實可能會改變它的評估方式。 C 不是這些語言之一。

如果將其更改為:

int main(){
 char a = 5;
 float b = 6.6;
 int c = a + 2*b;
 return c;
}

那么很明顯,您必須將浮動18.2保持到最后。

在沒有優化的情況下,gcc 就好像這可能發生一樣,並進行大量轉換。

僅使用-O它已經自己進行數學運算並直接返回最終整數,即使在上面的示例中也是如此。

這里沒有中間推理和捷徑。 為什么從5+6.0簡化為5+6而不是11 要么裝傻,做cvtsi2ss xmm1,eax (和 back 等),要么直接告訴他們11

暫無
暫無

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

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