目录
实例
今天这篇是运算符系列的尾声了,相信大家都对运算符有了了解和认识。
杂项运算符
杂项运算符听名字就知道,这部分运算符比较杂,不属于任何一类,所以将这些零散的运算符放在一起称之为杂项运算符。
运算符 | 描述 |
sizeof | sizeof运算符版规变量的大小。 |
Condition?X:Y | 条件运算符。如果Condition为真?则值为X;否则为Y。 |
, | 逗号运算符会执行一系列的运算。整个逗号表达式的值是以逗号分隔的列表中最后一个表达式的值。 |
.(点)和->(箭头) | 成员运算符用于引用类,结构体的成员。 |
Cast | 强制转换运算符把一种数据类型转换为另一种数据类型。 |
& | 指针运算符& 返回变量的地址。 |
* | 指针运算符* 指向一个变量。 |
其中.和->两个运算符会在后期说“类”的时候会讲到;&和*会在稍后,也就是“类”的前面说指针的时候讲到。
实例
1. int a=1,b=2;
cout<<sizeof(a)<<endl;
2.int c=a>b?1:0;
cout<<c<<endl;
3.int d=a<b?1:0;
cout<<d<<endl;
4.int e=(a,b,c);
cout<<e<<endl;
5.float f=float(e);
cout<<f<<endl;
cout<<&f<<endl;
6.float *g=&f;
cout<<g<<endl;
cout<<&g<<endl;
解析
1.这个实例就是求整型1的所占内存的大小,结果是4。
2.这个例子描述的是先定义一个c,将如果a>b为真那么结果为1,如果是假那么结果为0赋给c。因为a>b为假所以将0赋给c所以最后的输出结果就是0。
3.这个例子为上面的变式,可以自己思考一下。输出结果为1。
4.这个例子就是逗号运算符,括号是为了提高优先级,让a,b,c可以先计算出结果。还记得规则吗,逗号运算符就是看最后一个表达式,该式的值就是e的值,结果是0。
5.这就是类型强制转换,因为e的值是0是整型,所以用float()的方法来使e转换成浮点型再进行赋值,所以f的值为0.0。而&的意思就是找到f这个变量的地址,这个变量存储的是0.0所以结果也就是存储0.0的地址。
6.这是指针,我们让指针g存储存储了f的地址,所以输出g的结果就是f的地址。而在地址前面加上&就会倒推出是这个地址的值,也就是0.0。(不理解的话后期会说到)
提醒:
在C++中一般不会用强制类型转换符有下面几个原因:
1.缺乏类型安全检查:强制类型转换会绕过C++的类型系统,允许开发者在不进行任何类型安全检查的情况下将一种类型转换为另一种类型。这可能导致数据丢失、精度下降或程序行为不符合预期。
2.可读性和可维护性降低:使用强制类型转换符的代码往往难以阅读和维护,因为其他开发者(或未来的你)可能不清楚为什么需要进行这种转换,以及这种转换是否安全。
哎,那有没有替代方案呢,还真有:C++提供了更安全的类型转换操作符,如static_cast、dynamic_cast、const_cast和reinterpret_cast,这些操作符提供了更明确的类型转换意图,并能在一定程度上进行类型安全检查。
运算符优先级:
类型 | 运算符 | 结合性 |
后缀 | () [] - > . ++ -- | 从左向右 |
一元(单目) | + - ! ~ ++ -- (type) * & sizeof | 从右向左 |
乘除 | * / % | 从左向右 |
加减 | + - | 从左向右 |
移位 | << >> | 从左向右 |
关系 | < <= > >= | 从左向右 |
相等 | == ! = | 从左向右 |
位与 | & | 从左向右 |
位异或 | ^ | 从左向右 |
位或 | | | 从左向右 |
逻辑与 | && | 从左向右 |
逻辑或 | || | 从左向右 |
条件(三元预算符,唯一) | ?: | 从右向左 |
赋值 | = += -= *= /= %= >>= <<= &= ^= |= | 从右向左 |
逗号 | , | 从左向右 |
以上就是运算符优先级的表格,优先级从上向下依次减小。不知道其中具体含义的同学可以去看我往期内容。
上面的表多看看,主要是混眼熟,真背的话不容易。
两点建议:
1.一般来说单目运算符优先级高于双目运算符。
2.不清楚优先级的话就加括号注意是小括号()。
再来明确一下,单目(一元)运算符就是计算中只需要一个操作数参与的运算符,那么双目(二元)运算符就是两个操作数,三目运算符(三元)就是需要三个操作数。
到这个文章为止,运算符系列差不多也就结束了,我们也学习了很多运算符,对于这块的知识我的建议就是多看一看,想一想就会理解了。
🆗感谢阅读,求个免费的赞。