如果b的值为0,那么a=b的值就为0,if里面判断的值就是false
思考
if(a==1)if(b==2) std::cout,<<"b-2";
elsestd::cout<
当a为2时,这里输出什么
这里什么都不输出
解析:因为if和else是一对的
if(a&&b)相当于a!=0&&b!=0
if(!a)相当于if(a==0)
思考
下面哪种写法更好
bool a {500};
int c {100};
if((c*100+c++)&&a) //写法1
{...
}
//写法2
// if(a&&(c*100+c++))
//{
// ...
//}
第二种更好
因为如果a是false,第二种后面的代码就不用执行了,而第一种方法c*100+c++还要执行一次
if(条件)
{临时变量
}
else
{临时变量
}
缺点:如果要使用同一个临时变量,就要声明两次
++17新语法
if(变量声明;条件)
{}
else
{}
这里声明一次变量,if和else中都能使用
特别注意*:这里的变量声明只能声明一种类型的变量
switch 3
{case 2:int a=9;break;case 3:break;
}
特别注意*:每次用完case 后,要记得用break,不然程序就会执行到下一个case
这种声明临时变量的方式是错误的,因为a生命周期在括号内有效,当switch选择的是3,就跳过了a的初始化,但是a又是有效的,这就产生了矛盾,解决方式就是在case 2下面把语句块括起来
C++17新语法
switch (变量声明;值)
{case 2:int a=9;break;case 3:break;
}
if和switch比较
if (a == 500)
00E915F1 cmp dword ptr [a],1F4h
00E915F8 jne main+50h (0E91610h) 00E9160E jmp main+82h (0E91642h)
else if (a == 600)
00E91610 cmp dword ptr [a],258h
00E91617 jne main+6Fh (0E9162Fh) 00E9162D jmp main+82h (0E91642h)
if底层是用了cmp指令,每次用if都要用一次cmp指令,cmp指令是用来比较的
switch (a)
00E91642 mov ecx,dword ptr [a]
00E91645 mov dword ptr [ebp-10h],ecx
00E91648 cmp dword ptr [ebp-10h],1F4h
00E9164F je main+9Ch (0E9165Ch)
00E91651 cmp dword ptr [ebp-10h],258h
00E91658 je main+0B2h (0E91672h)
00E9165A jmp main+0C7h (0E91687h) {case 500:std::cout << "a=500";
00E9165C push 0E98D30h
00E91661 mov edx,dword ptr [__imp_std::cout (0E9C0CCh)]
00E91667 push edx
00E91668 call std::operator<< > (0E9129Eh)
00E9166D add esp,8 break;
00E91670 jmp main+0DBh (0E9169Bh)
switch底层原理是提前把所有选项放在一个表里面,然后去查这个表,查到了对应数值之后,会给一个内存地址 ,直接跳转到这个选项,如果有许多个选项,用switch,效率更高
上一篇:中秋送父母月饼的句子
下一篇:玄门小祖宗洛青莲身份