多次操作,我想這樣做在同一行(C語言編程):下,在單行
int x = index >> 8;
int y = x < 10 ? x+1 : x+2;
這可能嗎?我以前如何參考價值?標誌,如果我沒有它存儲在單獨的整數?
"int y = (index >> 8) < 10 ? [what]+1 : [what]+2;"
多次操作,我想這樣做在同一行(C語言編程):下,在單行
int x = index >> 8;
int y = x < 10 ? x+1 : x+2;
這可能嗎?我以前如何參考價值?標誌,如果我沒有它存儲在單獨的整數?
"int y = (index >> 8) < 10 ? [what]+1 : [what]+2;"
你只需要重複表達:
int y = (index >> 8) < 10 ? (index >> 8) + 1 : (index >> 8) + 2;
這不是很漂亮,或可讀的,所以我不明白你爲什麼要這樣來做。語言中沒有內置的方式來引用?
之前的表達式。由於表達式可能會在C中產生副作用,因此如果存在,則會非常多毛。
你有這種表達方式是最好的,你可以在那裏沒有代碼重複。 如果你絕對需要它是一個字符串,你可以簡單地做到以下幾點:
int y = (index >> 8) < 10 ? (index >> 8)+1 : (index >> 8)+2;
因爲C使得空格字符之間沒有區別,你可以把它在一個單行:
int x = index >> 8; int y = x < 10 ? x+1 : x+2;
...這是完全有效C.
但是你y
和x
值不依賴間,這樣可以簡化表達,只是y
:
int y = index >> 8; y = y < 10 ? y+1 : y+2;
如果您y
已經存在,你可以使用很少使用逗號操作符的消除分號,它減少到一個語句:
y = (y = index >> 8), y < 10 ? y+1 : y+2;
請注意,您不能使用值聲明語句中的逗號操作符,因爲在該上下文中它變成了序列分隔符。
或者,通過去除三元組。這個轉換相當於除以256,我們可以在轉換之前比較這個值。
int y = (index >> 8) + 1 + (index >= 2560);
當然,這個指數應該是正值。
編輯:表達也有沒有臨時寫訪問和沒有序列點的優勢。
雖然這適用於所用示例,但它不適用於所有形式的類似表達式。 – 2012-07-31 20:41:13
這是表明,有時通過數學轉換,你可以找到更好的表達。編譯器有時會做這些事情,但它們常常受到他們無法解決的普遍規則的約束(比如對過流,精度和符號的影響)。程序員確實知道得更多,並且可以用可以應用在案例中的表達式替換。 – 2012-08-01 21:13:34
它使用這種形式是可能的:
int y = (y = index >> 8) < 10 ? y+1 : y+2;
這裏,y得到分配指數>> 8的臨時值,這樣你就可以重新使用後的價值?運營商。
與David的類似答案相反,此表單也在值聲明語句中工作。
啊,是的,你很聰明! – Dai 2012-07-31 21:30:11
以這種方式嘗試優化源代碼通常是沒有用的。 C沒有指定計算機必須執行的具體操作; C指定程序必須達到的結果。 (通過C中的「彷彿」模型編譯器生成的程序必須產生結果,就好像您逐步完成了您編寫的具體操作一樣,但實際上可以通過實現選擇的任何指令序列獲得這些結果。該程序只需要重現結果,而不是機制。)
一般來說,你應該寫你的代碼是明確的,你應該讓編譯器優化做高效率地執行計算它的工作。
清晰度比簡潔更重要。在這種情況下,兩條線比一條好。該'[最新]'位必須是'(指數>> 8)'括號,並會與重複不太清楚,即使優化器可能會優化你你是什麼左右後。 – 2012-07-31 20:07:54