C++ 部分运算符的优先级
主要是一些不太清晰的运算符优先级记录
一、复合表达式中优先级的情况
在复合表达式中若干子表达式指向并修改了同一个对象
,可能会出现一些无法预知的情况。
int i = f1() * f2() // 在运算中,不同的编译器对于先执行f1()还是f2()不一定
int j = 0;
cout << j << " " << ++j << endl; // 同上,不同编辑器中无法预知先执行j还是++j
二、赋值运算符优先级
赋值运算符的优先级贼低。
int i;
while (i = 5 != 42) {
cout << i << endl; // 先运算不等于语句,再赋值,输出i为1
// 其他处理
}
int j;
while ((j = 5) != 42) {
cout << j << endl; // 先赋值,在进行不等于语句,输出j为5
// 其他处理
}
三、混用解引用和递增运算符优先级
解引用的优先级高于递增运算符。
int a[2] = {1, 3};
int * iter = a;
int * iter1 = a;
// 假设ptr是一个指针
cout << *iter++ << endl; // 先解引用iter,创建副本输出1,然后iter指针地址加1
cout << ++*iter1 << endl; // 输出2,相当于是先解引用iter,然后对其指向的值进行++
四、条件运算符优先级
条件运算符的优先级非常低,并采用右结合律。
int grade = 50;
string finalgrade = (grade > 90) ? "high" : (grade > 70) ? "middle" : "low"; // 先是结合后一堆的条件表达式,然后把其的结果作为前一个表达式的结果分支
cout << grade < 60 ? "low" : "middle" << endl; // 错误:先运行cout << grade,之后是cout<60作为判断对象
五、移位运算符优先级
移位运算符的优先级不高不低,介于中间:比算术运算符优先级低,但是比逻辑运算符优先级高。
cout << 42 + 10 ; // 正确:输出求和结果
cout << (10 < 42) ; // 正确:输出比较结果
cout << 10 < 42 ; // 错误:先运算cout << 10,得出cout对象,将cout对象与42比较。
六、点运算与解引用优先级
点运算符的优先级比解引用优先级高。
string s1 = "ceshi"; * p = &s1;
auto n = s1.size();
n = (*p).size(); // 正确:通过解引用p取到string对象s1,调用其size()成员函数
n = p->size(); // 正确:箭头运算符为点运算符加解引用的结合,效果和上式一样
n = *p.size(); // 错误:先运算点运算符,取p的size()成员函数,但是p是一个指针,没有该函数
七、函数调用优先级
调用运算符的优先级与点运算符和箭头运算符相同。
auto sz = shorterString(s1, s2).size();