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

时间:2013-09-16 08:01:45

标签: c

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

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

他说我不使用switch,if if或ifnary运算符来重写这段代码。怎么做?

7 个答案:

答案 0 :(得分: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;

答案 1 :(得分:11)

a != 25 || (a = 0);

这不使用“switch,if else或ternary operator”

答案 2 :(得分:8)

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

参见C标准 6.3.2.1p2:

  

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

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

答案 3 :(得分:6)

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

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

您需要在作业周围添加括号,因为作业的分配比&&运算符低precedence

答案 4 :(得分:3)

另一个有趣的答案可能是

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

这不使用'if-else','switch'或'ternary operator'

答案 5 :(得分:0)

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

a = (a+1) % 25;

但是这当然不会在a可以是任何内容的情况下起作用,并且a==25只有 才会被重置,而a==26则{{1}} 1}}应该保持不变。

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

答案 6 :(得分:-2)

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

a %= 25;