C/C++系列语言中,if-else语句是最主要的条件分支语句:
if(A) B;
else C;
其功能就是如果A成立,则执行B,否则执行C。类似的还是三目运算符:
A?B:C;
其功能与if语句类似,并且由于是表达式,它也有返回值,返回的就是被实际执行的语句的返回值。但如果既不使用if语句又不使用三目运算法,有没有办法也进行条件分支呢?答案是肯定的,方式就是使用“短路法”。
C/C++系列语言的逻辑运算法&&和||有一个副作用,就是有短路效果。对于与运算法&&来说,只有被它连接的两个表达式都成立时才返回值,那么如果左边的表达式结果为假,那么无论右边的表达式结果如何,结果都为假,此时就不会再执行右边的表达式了。或运算符||与之类似,只要有一个表达式为真结果就为真,那么当它左边的表达式为真时,右边的就不会被执行了。利用这种特性,即可以写出取代if语句和三目运算法的代码:
A && (B, 1) || C;
这段代码使用与、或运算符以及逗号把三个语句A、B、C以及常数1连接起来,其功能与if语句是非常类似的。具体来说,当表达式A返回真值时,由于A与B之间是与运算符,仍需要再判断B的值,所以起来了“如果A成立则执行B”的作用,但若B的返回值为假,就会进一步判断C的值,这与开始的要求不符,因此把B改造为逗号表达式,让它总是返回“1”,这样一来就不会执行C了。如果A不成立,那么B已无需执行,只要再判断C的值即可,这就实现了“若A不成立则执行C”的要求。
当然这种写法也有一些限制,B和C的部分不适合写太长,并且必须有返回值,否则编译器会报编译时错误。
这个技巧有什么用?我也不知道,可能唯一的用处就是能让程序短一点点,难懂一点点,实际编程中应该不会使用到,但对于理解短路法编程的作用、逗号表达式的作用还是有帮助的。
阅读(1454) | 评论(0) | 转发(0) |