2012-07-31 41 views
2

多次操作,我想這樣做在同一行(C語言編程):下,在單行

int x = index >> 8; 
int y = x < 10 ? x+1 : x+2; 

這可能嗎?我以前如何參考價值?標誌,如果我沒有它存儲在單獨的整數?

"int y = (index >> 8) < 10 ? [what]+1 : [what]+2;" 
+2

清晰度比簡潔更重要。在這種情況下,兩條線比一條好。該'[最新]'位必須是'(指數>> 8)'括號,並會與重複不太清楚,即使優化器可能會優化你你是什麼左右後。 – 2012-07-31 20:07:54

回答

2

你只需要重複表達:

int y = (index >> 8) < 10 ? (index >> 8) + 1 : (index >> 8) + 2; 

這不是很漂亮,或可讀的,所以我不明白你爲什麼要這樣來做。語言中沒有內置的方式來引用?之前的表達式。由於表達式可能會在C中產生副作用,因此如果存在,則會非常多毛。

1

你有這種表達方式是最好的,你可以在那裏沒有代碼重複。 如果你絕對需要它是一個字符串,你可以簡單地做到以下幾點:

int y = (index >> 8) < 10 ? (index >> 8)+1 : (index >> 8)+2; 
1

因爲C使得空格字符之間沒有區別,你可以把它在一個單行:

int x = index >> 8; int y = x < 10 ? x+1 : x+2; 

...這是完全有效C.

但是你yx值不依賴間,這樣可以簡化表達,只是y

int y = index >> 8; y = y < 10 ? y+1 : y+2; 

如果您y已經存在,你可以使用很少使用逗號操作符的消除分號,它減少到一個語句:

y = (y = index >> 8), y < 10 ? y+1 : y+2; 

請注意,您不能使用值聲明語句中的逗號操作符,因爲在該上下文中它變成了序列分隔符。

0

或者,通過去除三元組。這個轉換相當於除以256,我們可以在轉換之前比較這個值。

int y = (index >> 8) + 1 + (index >= 2560); 

當然,這個指數應該是正值。

編輯:表達也有沒有臨時寫訪問和沒有序列點的優勢。

+0

雖然這適用於所用示例,但它不適用於所有形式的類似表達式。 – 2012-07-31 20:41:13

+1

這是表明,有時通過數學轉換,你可以找到更好的表達。編譯器有時會做這些事情,但它們常常受到他們無法解決的普遍規則的約束(比如對過流,精度和符號的影響)。程序員確實知道得更多,並且可以用可以應用在案例中的表達式替換。 – 2012-08-01 21:13:34

0

它使用這種形式是可能的:

int y = (y = index >> 8) < 10 ? y+1 : y+2; 

這裏,y得到分配指數>> 8的臨時值,這樣你就可以重新使用後的價值?運營商。

與David的類似答案相反,此表單也在值聲明語句中工作。

+0

啊,是的,你很聰明! – Dai 2012-07-31 21:30:11

1

以這種方式嘗試優化源代碼通常是沒有用的。 C沒有指定計算機必須執行的具體操作; C指定程序必須達到的結果。 (通過C中的「彷彿」模型編譯器生成的程序必須產生結果,就好像您逐步完成了您編寫的具體操作一樣,但實際上可以通過實現選擇的任何指令序列獲得這些結果。該程序只需要重現結果,而不是機制。)

一般來說,你應該寫你的代碼是明確的,你應該讓編譯器優化做高效率地執行計算它的工作。