我正在接受技术面试,面试官给了我一段这样的代码
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"
由于您使用的是未初始化的变量,因此提出的问题会给出未定义的行为.因此,您可以自由编写您喜欢的任何代码(只要它编译).
见C标准6.3.2.1p2:
如果左值指定了一个自动存储持续时间的对象,该对象可以使用寄存器存储类声明(从未使用其地址),并且该对象未初始化(未使用初始化程序声明,并且在使用之前未对其进行任何赋值) ),行为未定义.
在我看来,这是一个明智的答案:虽然以这种方式回答问题时你会优雅.
请记住,赋值只是一个普通的表达式,因此可以用作另一个表达式的一部分.例如,您可以使用短路逻辑和运算符:
a == 25 && (a = 0);
Run Code Online (Sandbox Code Playgroud)
您需要在赋值周围加上括号,因为赋值的优先级低于&&运算符.