8

我在一个技术面试中,面试官给了我一段这样的代码

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

他说我重写这段代码而不使用 switch、if else 或三元运算符作为 if 条件。怎么做?

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:

如果左值指定了一个可以使用寄存器存储类声明的具有自动存储持续时间的对象(从未使用过它的地址),并且该对象未初始化(未使用初始化程序声明并且在使用之前未对其进行分配),行为未定义。

在我看来,这是一个聪明的答案:尽管在以这种方式回答问题时保持优雅是明智的。

于 2013-09-16T08:09:58.443 回答
6

请记住,赋值只是一个普通的表达式,因此可以用作另一个表达式的一部分。例如,您可以使用短路逻辑和运算符:

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 回答
0

如果隐含的上下文是一个a总是重复循环的计数循环0..24,那么也许在数学上更有吸引力的解决方案是

a = (a+1) % 25;

a但这当然在可以是任何东西的情况下不起作用,它应该在 的情况下重置a==25,而a==26应该留下一些东西。

不过,如果您搜索这样的“语义”解决方案,面试官可能会喜欢它,并且可以解释何时使用它。

于 2013-09-16T09:14:12.093 回答
-2

我认为面试官希望你使用这条线而不是if

a %= 25;
于 2013-09-16T09:20:46.877 回答