我正在接受技术采访,面试官给了我一段这样的代码
int a=1;
a++;
...something..
...something.
if(a==25)
a=0;
他说我不使用switch,if if或ifnary运算符来重写这段代码。怎么做?
答案 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;