これを 1 行で実行したい (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 では式に副作用がある可能性があるため、あるとしたら非常に面倒です。
この方法でソース コードを最適化しようとしても、一般的には役に立ちません。C は、コンピューターが実行する必要がある特定の操作を指定しません。C は、プログラムが達成しなければならない結果を指定します。(C の「as if」モデルによる。コンパイラが生成するプログラムは、記述した特定の操作をステップ実行したかのように結果を生成する必要がありますが、それらの結果は、実装が選択した命令の任意のシーケンスによって実際に取得できます。プログラムメカニズムではなく、結果を再現する必要があるだけです。)
一般に、コードを明確に記述する必要があり、コンパイラーのオプティマイザーが計算を効率的に実行できるようにする必要があります。
この式を使用する方法は、コードの繰り返しなしでそこに到達できる最善の方法です。絶対に単一の文字列にする必要がある場合は、次のようにするだけです。
int y = (index >> 8) < 10 ? (index >> 8)+1 : (index >> 8)+2;
C では空白文字を区別しないため、空白文字を 1 行で記述できます。
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);
もちろん、これが機能するには、インデックスが正でなければなりません。
EDIT:式には、一時的な書き込みアクセスやシーケンスポイントがないという利点もあります。
このフォームを使用して可能です:
int y = (y = index >> 8) < 10 ? y+1 : y+2;
ここで、y にはインデックス >> 8 の一時的な値が割り当てられるため、? の後にその値を再利用できます。オペレーター。
Davidの同様の回答とは対照的に、このフォームは値宣言ステートメント内でも機能します。