2013-02-26 27 views
1

是否有可能實現一個if檢查-1,如果不是-1,則分配值。但不必兩次調用該函數?或將返回值保存到局部變量。我知道這是可能的彙編,但有一個C實現?如果語句在C&賦值時沒有雙重調用

int i, x = -10; 
if(func1(x) != -1) i = func1(x); 
+0

無論如何,沒有函數調用,寫入的'i'不確定(即它沒有定義的值),所以它有什麼關係? 'if((i = func(x))!= -1){/ * use i * /}'和'其他'一樣好。 – WhozCraig 2013-02-26 03:14:20

+0

C的較短行並不意味着更快的程序。你需要比較大會,看看是否有任何獲得。通常這些類型的「優化」並不是真正的優化,它們只是令人困惑。 – 2013-02-26 03:17:59

+0

@JoshPetitt假設func1執行一些其他副作用,類似於rand。它仍然是一個優化? – Sebivor 2013-02-26 03:52:09

回答

0
int c; 
if((c = func1(x)) != -1) i = c; 
2

返回值保存到一個局部變量

以我的經驗,避免局部變量是很不值得沒收的清晰度。大多數編譯器(大部分時間)通常可以避免相應的加載/存儲,並只爲那些當地人使用寄存器。所以不要回避它,擁抱它!維護人員的完整性可能是你自己的。

我知道這是可能的程序集,但有沒有c實現?

如果事實證明您的情況是彙編實際上是合適的情況下,請在頭文件中進行聲明並鏈接到彙編例程。

建議:

const int x = -10; 
const int y = func1(x); 
const int i = y != -1 
      ? y 
      : 0 /* You didn't really want an uninitialized value here, right? */ ; 
+0

也許這是唯一有價值的使用三元運算符(即能夠根據比較分配) – 2013-02-26 03:35:51

+0

@JoshPetitt,我認爲這可能是我曾經考慮過的唯一用途 - 什麼是濫用/誤用的例子? – 2013-02-26 03:38:04

+1

當人們使用它們而不是簡單的if語句時,因爲他們認爲它們以某種方式更快,因爲它們可以寫在一行上。例如,如果我已經有了一個價值。順便說一句,我不是說你做到了。 – 2013-02-26 03:39:39

0

我能想到的最好的實現是:

int i = 0; // initialize to something 
const int x = -10; 
const int y = func1(x); 

if (y != -1) 
{ 
    i = y; 
} 

的常量將讓編譯器,它認爲任何優化是最好的(也許是內嵌FUNC1)。注意func只調用一次,這可能是最好的。常數也允許y保存在一個寄存器中(爲了執行if,它將需要無論如何)。如果你想給更多的建議,你可以這樣做:

register const int y = func1(x); 

然而,兌現你的register關鍵字建議編譯器不是必需的,所以它可能是最好離開它。

編輯基於鼓勵布萊恩的回答是:

int i = ((func1(x) + 1) ?:0) - 1; 

BTW,我可能不會建議使用此,但它確實回答這個問題。這是基於SO question here。對我而言,我仍然對這個問題的原因感到困惑,它似乎更像是一個難題或求職面試問題,而不是在「真實」計劃中遇到的問題?我當然想聽聽爲什麼會這樣。

1

這取決於func1是否會產生任何副作用。以rand()或getchar()爲例。連續調用這些函數可能會導致不同的返回值,因爲它們會產生副作用; rand()更改種子,並且getchar()從stdin中消耗一個字符。即rand() == rand()通常 評估爲false,並且getchar() == getchar()不能被可靠地預測。假設func1產生副作用,對於具有相同輸入的連續調用,返回值可能不同,因此func1(x) == func1(x)可能評估爲false。

如果func1沒有產生任何副作用,並且輸出僅基於輸入是一致的,那麼我不明白爲什麼你不會解決int i = func1(x);,並且基本邏輯是否爲i == -1。編寫最少的重複代碼可以提高可讀性和可維護性。如果你擔心這種效率,不要這樣做。你的編譯器很可能足夠聰明,可以消除死代碼,所以它會很好地把它轉換成相當高效的東西。

1. ......至少在任何理智的標準庫實現中。

+0

(不想爭辯),但即使有副作用,也不會int i = func1(x);最有意義?它只調用一次函數?順便說一句,我完全同意你的第二段,副作用或沒有副作用。 – 2013-02-26 12:57:25

+0

@JoshPetitt:假設func1會產生副作用,if(func1(x)== -1){i = func1(x); }'可能會產生兩倍於int i = func1(x)的副作用;'...就像if(getchar()!= -1){i = getchar(); }'可能會消耗兩倍於'int i = getchar();'的字符。 – Sebivor 2013-02-26 13:03:39

+0

表示同意,這就是爲什麼我要說func1一次,而不是兩次。我瞭解你對副作用的擔憂。 – 2013-02-26 14:23:28