8

私は技術面接を受けていましたが、面接担当者は次のようなコードを教えてくれました

  int a=1;
  a++;
  ...something..
  ...something.
  if(a==25)
   a=0;

彼は、if 条件に switch,if else または三項演算子を使用せずに、このコードを書き直すように私に言いました。それはどのように行うことができますか?

4

7 に答える 7

21

実際には非常に簡単です:

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;
于 2013-09-16T08:04:16.417 に答える
11
a != 25 || (a = 0);

これは「switch,if else または三項演算子」を使用しません

于 2013-09-16T08:06:00.087 に答える
8

提起されたように、初期化されていない変数を使用しているため、未定義の動作が発生します。したがって、好きなコードを自由に記述できます (コンパイルできる限り)。

C 標準6.3.2.1p2を参照してください。

左辺値が register ストレージ クラスで宣言できた可能性のある自動ストレージ期間のオブジェクトを指定し (そのアドレスが取得されていない)、そのオブジェクトが初期化されていない (初期化子で宣言されておらず、使用前に割り当てが実行されていない) 場合)、動作は未定義です。

私の意見では、それが賢明な答えです。ただし、このように質問に答えるときは、優雅に答えるのが賢明です。

于 2013-09-16T08:09:58.443 に答える
6

割り当ては単なる通常の式であるため、別の式の一部として使用できることに注意してください。たとえば、短絡論理 and 演算子を使用できます。

a == 25 && (a = 0);

代入は演算子よりも優先順位が低いため、代入を括弧で囲む必要があります。&&

于 2013-09-16T08:07:22.443 に答える
3

別の興味深い答えは

for ( ; a == 25 ; ) {
    a = 0; break;
}

これは「if-else」、「switch」または「三項演算子」を使用しません

于 2013-10-14T08:40:15.730 に答える
-2

インタビュアーは、代わりにこの行を使用することを望んでいたと思いますif:

a %= 25;
于 2013-09-16T09:20:46.877 に答える