在没有条件语句或运算符的情况下重写一段C代码?

mri*_*dra 8 c

我正在接受技术面试,面试官给了我一段这样的代码

  int a=1;
  a++;
  ...something..
  ...something.
  if(a==25)
   a=0;
Run Code Online (Sandbox Code Playgroud)

他说我在不使用switch的情况下重写这段代码,if if或if条件的三元运算符.怎么做?

orl*_*rlp 21

实际上很简单:

a *= (a != 25);
Run Code Online (Sandbox Code Playgroud)

如果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;
Run Code Online (Sandbox Code Playgroud)


AnT*_*AnT 11

a != 25 || (a = 0);
Run Code Online (Sandbox Code Playgroud)

这不使用"switch,if else或ternary operator"


Bat*_*eba 8

由于您使用的是未初始化的变量,因此提出的问题会给出未定义的行为.因此,您可以自由编写您喜欢的任何代码(只要它编译).

见C标准6.3.2.1p2:

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

在我看来,这是一个明智的答案:虽然以这种方式回答问题时你会优雅.

  • @Zaibis:当然可以,但你怎么重写一些可能有任何结果的东西呢?如果我在面试中看到这样的问题,那将是我想到的第一件事 - 他们希望你浪费时间分析解决问题的方法是无法解决的.关于GRE定量部分有很多这类问题,如果你不学会正确分析它们,你就永远不会有竞争力.在一次采访中,雇主正在判断你的分析能力 - 如果我是面试官,我绝不会雇用那些没有指出'a`未初始化的人. (3认同)

Som*_*ude 6

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

a == 25 && (a = 0);
Run Code Online (Sandbox Code Playgroud)

您需要在赋值周围加上括号,因为赋值的优先级低于&&运算符.