说几个和大家不一样的(不用switch case)

你需要先弄清楚if-else的工作原理。
if就像一个铁路分叉道口,在CPU底层这种通讯及其不好的地方,在火车开近之前,鬼知道火车要往哪边开,那怎么办?猜!
如果猜对了,它直接通过,继续前行。
如果猜错了,车头将停止,倒回去,你将铁轨扳至反方向,火车重新启动,驶过道口。
如果是第一种情况,那很好办,那第二种呢?时间就这么浪过去了,假如你非常不走运,那你的程序就会卡在停止-回滚-热启动的过程中。
上面猜的过程就是分支预测。
虽然是猜,但编译器也不是随便乱猜,那怎么猜呢?答案是分析之前的运行记录。假设之前很多次都是true,那这次就猜true,如果最近连续很多次都是false,那这次就猜false。
但这一切都要看你的CPU了,因此,一般把容易成立的条件写在前面判断,把不容易成立的条件放在else那里

三目运算符

三目运算符,又称条件运算符,是计算机语言(c,c++,java等)的重要组成部分。它是唯一有3个操作数的运算符,所以有时又称为三元运算符。一般来说,三目运算符的结合性是右结合的。

<表达式1> ? <表达式2> : <表达式3>; "?"运算符的含义是:先求表达式1的值,如果为真,则执行表达式2,并返回表达式2的结果;如果表达式1的值为假,则执行表达式3,并返回表达式3的结果。

可以理解为条件 ? 结果1 : 结果2 里面的?号是格式要求。也可以理解为条件是否成立,条件成立为结果1,否则为结果2。

例如

int a=read();
if(a&1)puts("odd");
else puts("even");

等价于

int a=read();    
(a&1)?puts("odd"):puts("even");

在代码的实现中,对于很多的if和else,可以三目套一个三目

int a=read();
if(a>0){
    if(a&1)puts("odd");
    else puts("even");
}
else{
    if(a&1)puts("ODD");
    else puts("EVEN");
}

此代码等价于

int a=read();    
(a>0)?((a&1)?puts("odd"):puts("even")):((a&1)?puts("ODD"):puts("EVEN"));

短路运算符

我们知道&&和||是两个短路运算符,什么叫短路运算符,就是一旦可以确定了表达式的真假值时候,就直接返回真假值了,比如下面代码

int a=read();
(a&1)&&puts("odd");
(a&1)||puts("even");
}

因为&&运算符号表示两者都满足
当左边为真的时候就判断右边是否为真(就运行右边)
否则因为左边为假就不运行右边(因为右边无论是否为真的无法让整个为真)

||同理

左边为假,就调用右边
否则就不运行右边

因此可以把它给合起来

int a=read();
((a&1)&&!puts("odd"))||puts("even");

所以

if(A) B; → (A)&&(B)

if(A) B; else C; → A&&(B,1)||C

但这些并不是短路运算符的精髓,短路运算符的精髓不仅在于优化时间,更是可以防止程序出错。

double t = rand();
if (t / RAND_MAX < 0.2 && t != 0)
    printf ("%d", t);
double t = rand();
if (t != 0 && t / RAND_MAX < 0.2)
    printf ("%d", t);

这两种判断,谁快谁慢。但对于CPU来说很有区别。第一段代码中的t/RAND_MAX<0.2为true的概率约为 20%,但t!=0为true的概率约为1/RAND_MAX​​,明显小于20%

因此,如果把计算一个不含逻辑运算符布尔表达式的计算次数设为 1 次,设计算了 X 次,则对于第 1 段代码,X 的数学期望为 6/5​​ 次,但对于第二段代码,X 的数学期望2*(RAND_MAX-1) / RAND_MAX为 ,远远大于第一段代码。

不仅不同位置会优化时间,更是会防止程序错误,例如kuangbin搜索专题有题是Catch the Cow,就是搜索,不过判断走没走过得判断vis[n]和n < 1e6,我最最开始写的vis[n] && n < 1e6,提交上去RE了,看了很久才发现是这里的原因,得先判断n < 1e6,再做下一步操作。

所以, 遇到A&&B时,优先把可能为false的表达式放在前面。遇到A||B时,优先把可能为true的表达式放在前面。但也不一定是绝对这样,还得结合题目。

我就得这样的优化主要还是在确保程序准确无误的时候再加上
因为万一用了这个毒瘤了(特别是新手对变成不太熟悉,极容易出错)

其实不如在考虑一下剪枝吧!一些重复的结果被剪掉后会大大的减小时间而这种骚操作只会减掉几毫秒或几十毫秒

希望能对大家有用!