私は技術面接を受けていましたが、面接担当者は次のようなコードを教えてくれました
int a=1;
a++;
...something..
...something.
if(a==25)
a=0;
彼は、if 条件に switch,if else または三項演算子を使用せずに、このコードを書き直すように私に言いました。それはどのように行うことができますか?
私は技術面接を受けていましたが、面接担当者は次のようなコードを教えてくれました
int a=1;
a++;
...something..
...something.
if(a==25)
a=0;
彼は、if 条件に switch,if else または三項演算子を使用せずに、このコードを書き直すように私に言いました。それはどのように行うことができますか?
実際には非常に簡単です:
a *= (a != 25);
これは、a が 25 に等しい場合は a を 0 で乗算し、そうでない場合は a を 1 で乗算します。
同等性をテストすることも許可されていない場合は、完全に算術的な方法を次に示します。
unsigned int v = a - 25;
/* test for bits set and put result in lsb of v */
v |= v >> 16;
v |= v >> 8;
v |= v >> 4;
v |= v >> 2;
v |= v >> 1;
/* set a to a if lsb of v is 1, else set to 0 */
a *= v & 1;
a != 25 || (a = 0);
これは「switch,if else または三項演算子」を使用しません
提起されたように、初期化されていない変数を使用しているため、未定義の動作が発生します。したがって、好きなコードを自由に記述できます (コンパイルできる限り)。
C 標準6.3.2.1p2を参照してください。
左辺値が register ストレージ クラスで宣言できた可能性のある自動ストレージ期間のオブジェクトを指定し (そのアドレスが取得されていない)、そのオブジェクトが初期化されていない (初期化子で宣言されておらず、使用前に割り当てが実行されていない) 場合)、動作は未定義です。
私の意見では、それが賢明な答えです。ただし、このように質問に答えるときは、優雅に答えるのが賢明です。
割り当ては単なる通常の式であるため、別の式の一部として使用できることに注意してください。たとえば、短絡論理 and 演算子を使用できます。
a == 25 && (a = 0);
代入は演算子よりも優先順位が低いため、代入を括弧で囲む必要があります。&&
別の興味深い答えは
for ( ; a == 25 ; ) {
a = 0; break;
}
これは「if-else」、「switch」または「三項演算子」を使用しません
インタビュアーは、代わりにこの行を使用することを望んでいたと思いますif
:
a %= 25;