if细节
if(a=b){//本质上等价于if(b)
std::cout<<"test"<<std::endl;
}
if(int x = 1,int y = 2; sign){}//C++17后支持的定义变量,定义的变量可以在所有关联的if,else,else if中使用
if(sign; int a = 1){}//如果条件判断在前,那么只支持定义一个变量
if(a&&func()){}//执行成本低的a尽量在前,执行成本高的尽量在后
switch细节
switch基本使用
int main() {
int op;
cin >> op;
switch (op)
{
case 1: cout << "111" << endl; break;
case 2:
[[fallthrough]];//C++17引入的消除警告,即告诉编译器case 2没写break是我故意为之
case 3://输入2或3都会输出2233
cout << "2233" << endl;
case 4://4和输入其他都是default处理
default: break;
}
return 0;
}
switch()
switch注意事项
switch (op)
{
//int x = 1;编译错误
case 1:
//int y = 2;编译错误
case 2:
//int z = 3;编译错误
break;
default:
int k = 4;//正常正确
break;
}//之所以x,y,z都编译错误是因为三个变量的定义声明和作用域是在switch (op){}的{}中的
//因为switch的执行顺序总是由上往下走的。如定义了x,y,z,总存在假如情况为default时而没导致没定义x,y,z。因此编译器防止这种错误
//一定要记住顺序由上往下走的,如下述代码的k则编译错误
switch (op)
{
default: int k = 4; break;//总存在case 1,2的可能使用k,而k却未定义的情况,因此编译器会判定编译错误
case 1:
case 2:
break;
}
switch注意事项的解决方法:利用代码块{}
具体化作用域即可
switch (op)
{
case 1:
case 2:
{ int a = 1; break;}
case 3:
{ int a = 1; }
break;
default: break;
}
可是假设如果我发现我的a变量总是在重复定义,换句话说我就是想在switch作用域下的变量呢 C++17
switch (int a = 1, int b = 2; op){}//变量在前不限制变量个数,如果变量未初始化能勉强过编译,但是如果使用到未初始化则会报错。
switch (op; int a = 1){}//变量在后只能定义一个初始化的变量,如果未初始化会报错
if和switch的出场时机:
如下两图if和switch的底层反汇编实现原理。
可以明显得知
if-else判断即为每多一个选项就判断一次跳转一次。
而switch则是类似维护一张表只需要比较一次就可以知道自己要跳转的位置
所以当选项较多推荐switch