-1をチェックし、負でない場合は-1をチェックして、値を割り当てるifを実装することは可能でしょうか。しかし、関数を2回呼び出す必要はありませんか?または、戻り値をローカル変数に保存します。これはアセンブリで可能ですが、AC実装はありますか?
int i, x = -10;
if( func1(x) != -1) i = func1(x);
-1をチェックし、負でない場合は-1をチェックして、値を割り当てるifを実装することは可能でしょうか。しかし、関数を2回呼び出す必要はありませんか?または、戻り値をローカル変数に保存します。これはアセンブリで可能ですが、AC実装はありますか?
int i, x = -10;
if( func1(x) != -1) i = func1(x);
戻り値をローカル変数に保存する
私の経験では、ローカル変数を回避することで、明快さを犠牲にする価値はほとんどありません。ほとんどのコンパイラは (ほとんどの場合)、対応するロード/ストアを回避し、それらのローカルにレジスタを使用することができます。だから避けないで、抱きしめて!維持されるメンテナーの正気は、あなた自身のものかもしれません。
アセンブリでこれが可能であることは知っていますが、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? */ ;
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. ... 少なくとも正常な標準ライブラリの実装では。
int c;
if((c = func1(x)) != -1) i = c;
私が考えることができる最良の実装は次のとおりです。
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に基づいています。私には、質問の理由についてまだ混乱しています。「実際の」プログラムで遭遇するものよりも、パズルや就職の面接の質問のように思えますか? なぜこれが必要なのか、ぜひお聞きしたいです。