我在做一道OJ题目的时候吗, 同样的题目如果用这段代码段
if(cnt%5 == 0)
printf("\n");
else if(i == high)
printf("\n");
要比用这段代码段
if(cnt%5 == 0 || i == high )
printf("\n");
要快,根据OJ上的数字,前者比后者快了一倍,当然整两个都是正确的,这是偶然吗?
在第二段代码中,首先会判断条件cnt%5==0是否成立,由于或机制的条件屏蔽,当其成立时第二个条件不执行,直接printf;
而cnt%5==0不成立时,还会进行判断第二个条件是否成立,当然还要执行或操作。
在第一段代码中两个条件判断是相同的,唯独没有或操作。
所以猜测第一段代码比第二段代码快,是由于没有或操作导致的。
这个要看你生成的汇编代码,以及你用的处理器的分支预测
原因 :
第一个代码段 如果刚好遇到了**cnt%5 == 0**时程序执行完毕
第二个代码段需要执行 cnt%5 == 0 和** i == high** 和一个** 逻辑或** 功能 所以前者比后者要快
应给是 cnt%5 == 0 条件成立,所以第一个没有执行else,而第二个依然要判断 i == high 条件是否成立,所以会多耗费一点时间
不是说|| 跟&& 差不多嘛,如果第一个条件成立是不会执行第二个条件 然后直接输出,如果第一个不成立才会运算第二个,恰好跟&&有点相反
快一倍肯定谈不上,第二种代码只有在cnt为特定值时才会慢一点,如果cnt是一个循环值,那速度应该只慢1/6左右
当然如果不是C或C++,那就要看断送逻辑了,如在VB下,这肯定是要慢一半的,因为VB对or运算只是要全部算完才判断