目录
C++运算符优先级(详解)
优先级 | 运算符 | 说明 | 结合性 |
1 | :: | 范围解析(作用域运算符) | 从左到右 |
2 | ++ -- | 后缀加加/减减 | 从左到右 |
2 | ( ) [ ] . -> | 括号,数组,成员选择 | 从左到右 |
3 | ++ -- | 前缀加加/减减 | 从右到左 |
3 | + - | 正/负 | 从右到左 |
3 | ! ~ | 逻辑非/按位取反 | 从右到左 |
3 | ( ) | 强制类型转换 | 从右到左 |
3 | * | 解引用(拿到地址处值) | 从右到左 |
3 | & | 取地址 | 从右到左 |
3 | sizeof | 求字节大小 | 从右到左 |
3 | new new[ ] | 动态/(动态数组)内存分配 | 从右到左 |
3 | delete delete[ ] | 动态/(动态数组)内存释放 | 从右到左 |
4 | .* ->* | 指向成员指针 | 从左到右 |
5 | * / % | 乘 除 余 | 从左到右 |
6 | + - | 加 减 | 从左到右 |
7 | << >> | 左移 右移 | 从左到右 |
8 | < <= > >= | 小于,小于等于 大于,大于等于 | 从左到右 |
9 | == != | 等于 不等于 | 从左到右 |
10 | & | 按位与 | 从左到右 |
11 | ^ | 按位异或 | 从左到右 |
12 | | | 按位或 | 从左到右 |
13 | && | 逻辑与 | 从左到右 |
14 | || | 逻辑或 | 从左到右 |
15 | ?: | 条件运算符 | 从右到左 |
16 | throw | 抛出 | 从右到左 |
16 | = += -= *= /= &= <<= >>= &= ^== |= | 前面的数和后面的数做运算赋值给前面那个数 | 从右到左 |
17 | , | 逗号表达式(值为逗号表示式最后元素的值) | 从左到右 |
C++运算符使用注意点
1.在使用算数运算符需要注意以下4个问题。
- 防止数据长度的溢出
- 遵循算数的自然特征,例如禁止除数为0。
- 取模标识符“%”要求参与运算的两个数均为整数
- “/”运算符的两个运算对象均为整数时,其结果是整数;如果有一个是浮点型数据,其结果就是浮点型数据,其结果就是浮点数。
2.由于++,--运算符内含了赋值运算,因此运算对象只能赋值,不能作用于常量和表达式
比如7++,8--,(m+n)++这里m和n是变量都是不合法的。
3.移位操作符效率高但是容易溢出!
4.注意C++中的位移运算符就是那两个<<和>>和输入输出流操作cout<<和cin>>这里面的符号虽然相同但是功能上是不一样的,原因是因为C++对这两个移位操作符进行了重载,用于输入输出流,<<和>>单独使用就还是移位操作符,佬们是不是不用纠结重载的概念,在后面将会深入介绍和学习!!!
以下是我找寻的大佬对于溢出的解释,再次表示感谢!
溢出:计算机组成原理笔记——移位运算,补码加减法及溢出现象_我要吃一条街的博客-CSDN博客_补码左移溢出规则
部分C++运算符例子
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;//包含头文件在命名空间
int main()
{
int m = 5;
cout << m++ << endl;
cout << m-- << endl;
cout << ++m << endl;
cout << --m << endl;
cout << -m++ << endl;
cout << -m++ << endl;
return 0;
}
想一想会打印出什么?尤其是最后两个。
答案是5 6 6 5 -5 -6
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;//包含头文件在命名空间
int main()
{
int i = 1, j = 2, k = 2, m = 4, n = 2;
k += i;
m %= j;
n += n -= n * n;
cout << "k= " << k << "m= " << m << "n= " << n << endl;
return 0;
}
输出为 k=3 m=0 n=-4
第三个n最后怎么算出来-4的呢,按照优先顺序,*先算然后+=和-=优先级相同,从右向左运算,所以所以最后得出n为-4。
#include<iostream>
using namespace std;
int main()
{
int a = 1, b = 2, c = 3;
cout << "a=" << a << " b=" << b << " c=" << c << endl;
//显示这三个的值是多少
b += a + 2 * c % 5;
cout << "b=" << b << endl;
a *= b = c = 3;//等价于c=3,b=a,a=a*b;
cout << "a=" << a << " b=" << b << " c=" << c << endl;
a += b += c;//等价于b=b+c;a=a+b;
cout << "a=" << a << " b=" << b << " c=" << c << endl;
a -= b = ++c + 2;//等价于++c;b=b+c;a=a-b;
cout << "a=" << a << " b=" << b << " c=" << c << endl;
return 0;
}
答案:
a=1 b=2 c=3
b=4
a=3 b=3 c=3
a=9 b=6 c=3
a=3 b=6 c=4
巩固——挑战习题
通过输入三角形3条边边长判断能否构成三角形,如果可以,运用数学公式求出三角形面积
a=根号下(s(s-a)(s-b)(s-c)),s=(a+b+c)/2;
题比较简单,直接上代码!
#include<iostream>
#include<math.h>//因为你需要使用sqrt开根号函数所以要引这个头文件
using namespace std;
int main()
{
float a, b, c;
float s, area;
cin >> a >> b >> c;//输入a,b,c的值
if (a > 0 && b > 0 && c > 0)
{
if (a + b <= c || b + c <= a || a + c <= b)
{
cout << "这三边无法构成三角形" << endl;
}
else
{
s = (a + b + c) / 2;
area = sqrt(s * (s - a) * (s - b) * (s - c));//利用公式求值
cout << "a=" << a << " b=" << b << " c=" << c << " s=" << s << endl;
cout << "area=" << area << endl;
}
}
return 0;
}
小结
这篇博客就是讲了C++的运算符及其优先级,和一些具体例子和使用的注意事项,有些运算符比如throw还没接触,但是不用着急,会马上更新的,觉得有帮助的点个赞谢谢,有什么意见问题,评论区可以畅所欲言。