1

-1をチェックし、負でない場合は-1をチェックして、値を割り当てるifを実装することは可能でしょうか。しかし、関数を2回呼び出す必要はありませんか?または、戻り値をローカル変数に保存します。これはアセンブリで可能ですが、AC実装はありますか?

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

4 に答える 4

2

戻り値をローカル変数に保存する

私の経験では、ローカル変数を回避することで、明快さを犠牲にする価値はほとんどありません。ほとんどのコンパイラは (ほとんどの場合)、対応するロード/ストアを回避し、それらのローカルにレジスタを使用することができます。だから避けないで、抱きしめて!維持されるメンテナーの正気は、あなた自身のものかもしれません。

アセンブリでこれが可能であることは知っていますが、AC 実装はありますか?

アセンブリが実際に適切なケースであることが判明した場合は、ヘッダー ファイルで宣言を行い、アセンブリ ルーチンに対してリンクします。

提案:

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? */ ;
于 2013-02-26T03:18:33.120 に答える
1

func1 が副作用を生成するかどうかによって異なります。例として、rand() または getchar() を検討してください。これらの関数を続けて 2 回呼び出すと、副作用が発生するため、異なる戻り値になる可能性があります。rand() はシードを変更し、getchar() は stdin から文字を消費します。つまり、通常1rand() == rand()はfalse と評価され、確実に予測することはできません。func1 が副作用を生成すると仮定すると、戻り値は同じ入力での連続した呼び出しで異なる可能性があり、したがってfalse と評価される可能性があります。getchar() == getchar()func1(x) == func1(x)

func1 が副作用を生成せず、出力が入力のみに基づいて一貫している場合、 で解決しない理由がわかりint i = func1(x);ませんi == -1。繰り返しの少ないコードを書くことで、読みやすさと保守性が向上します。これの効率について心配している場合は、気にしないでください。あなたのコンパイラはおそらく無駄なコードを排除するのに十分なほど賢いので、これをかなり効率的なものに変換するのに良い仕事をします.

1. ... 少なくとも正常な標準ライブラリの実装では。

于 2013-02-26T07:10:53.970 に答える
0
int c;
if((c = func1(x)) != -1) i = c;
于 2013-02-26T03:12:48.650 に答える
0

私が考えることができる最良の実装は次のとおりです。

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

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

const を使用すると、コンパイラが最適と判断した最適化 (おそらく inline func1) を行うことができます。func は 1 回だけ呼び出されることに注意してください。これがおそらく最適です。const y を使用すると、y をレジスターに保持することもできます (if を実行するには、いずれにせよ必要になります)。さらに提案したい場合は、次のようにします。

register const int y = func1(x);

ただし、コンパイラは register キーワードの提案を尊重する必要はないため、省略したほうがよいでしょう。

ブライアンの答えからのインスピレーションに基づいて編集:

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

ところで、おそらくこれを使用することはお勧めしませんが、質問には答えます。これはSO question hereに基づいています。私には、質問の理由についてまだ混乱しています。「実際の」プログラムで遭遇するものよりも、パズルや就職の面接の質問のように思えますか? なぜこれが必要なのか、ぜひお聞きしたいです。

于 2013-02-26T03:23:24.183 に答える