表达式由一个或多个运算对象组成,对表达式求值将得到一个哥结果。 字面量和变量是最简单的表达式。
4.1基础
一元运算符: &、^、*(解引用) 二元运算符: ==、+ 运算对象转换:在表达式求值的过程中,运算对象常由一种类型转换为 另外一种类型,小整型(char、bool、short)通常会被提升为大整型(int)
重载运算符 IO库的<< 、>>以及string、vector对象和迭代器使用的运算符都是重载的运算符。
4.1.2优先级和结合律
程序员可以使用括号将表达式某个局部括起来使其得到优先运算,优先级和结合律会影响程序的正确性。
4.1.3求值顺序
int i = f1() * f2();
我们知道f1和f2一定会在执行乘法之前被调用,但是我们无法知道到底f1先调用还是f2先调用。 对于没有指定那些没有指定执行顺序的运算符来说,如果表达式指向并修改了同一个对象,将会产生未定义的错误。如
int i = 0;
cout<< i << ' ' << ++i <<endl;
编译器可能先求++i,再求i,也有可能先求i再++i. 求值顺序、优先级、结合律
_f() + g() *h() + j()_
- 优先级规定:g()的返回值和f()的返回值相乘
- 结合律规定:f()的返回值相合gh乘积相加,最后加j()
- 对于这些函数的调用顺序没有明确规定。
4.2算术运算符
C++除法是向下取整。
- m % (-n) = m % n
- (-m)%n = -(m%n)
4.3逻辑和关系运算符
逻辑与&&和逻辑或||都是先求左侧运算对象,再求右侧运算对象的值,当且仅当左侧运算对象无法确定表达式结果时才会计算右侧运算对象的值,这称为短路求值。
4.4赋值运算符
a += i; a -= i; a <<= i ; a ^= i; 它和a = a + i; 唯一不同的区别是运算对象的求值次数,对程序性能的影响几乎可以忽略不计。
4.5递增和递减运算符
C++primer推荐尽量用 ++i(前置版本) , 尽量不用i++(后置版本) 性能上有区别,写出的代码也要复合编程的初衷。
auto pbeg = v.begin();
while(pebg != v.end() && *pebg >= 0)
cout<< *pebg++ <<endl;
输出pebg的值并向前移动一个元素
递增运算符的优先级高于解引用运算符, 因此*pebg++等价 *(pebg++)
建议:简介有时是一种美德,有些表达式其实是广泛使用、有效的,应该习惯这种写法,追求简洁,摒弃冗长
for(auto it = s.begin();it!=s.end()&&!isspace(*it);++it)
*it = toupper(*it);
auto it = s.begin();
while(it!=s.end()&&!isspace(*it))
*(beg+1) = toupper(*beg);
错误,赋值运算符左右两端都用到了it,右侧it的值还改变了,所以赋值语句是未定义。
4.6成员访问运算符
4.7条件运算符
条件运算法 (?:)允许我们把简单的if-else逻辑嵌入到单个表达式中,例如
string finalgrade = (grade < 60)?"fail":"pass";
允许在条件运算符内部潜逃另外一个条件运算符,例如
finalgrade = (grade>90)?"high"
:(grade>60)?"pass":"fail";
在输出中使用条件运算符,由于条件运算符优先级很低,因此常在其两端加括号
cout<<((grade<60)?"fail":"pass";);
cout<<(grade<60)?"fail":"pass";
第二条语句等价于:
cout<<(grade<60);
cout?"fail":"pass";
4.8位运算符
求反:~
左移:<<
右移:>>
按位与:&
按位异或:^
例如:unsigned a = 0233;
a = 0 1 0 - 0 1 1 - 0 1 1
a << 8 ;
a = 000000000 00000000 10011011 00000000
a << 31
a = 10000000 00000000 00000000 000000000
a >>3
a = 00000000 00000000 00000000 00-010011
用T(1) 的空间复杂度实现全班三十个同学挂不挂科的检测。
------------待补充------------------
4.9 sizeof运算符
sizeof运算符返回一条表达式或一个类型名字所占的字节数。 有两种形式:
sizeof(type)
sizeof expr
sizeof 还能获取整个数组的大小例如
int ia[N];
cout<< sizeof(ia)/sizeof(*ia);
4.10逗号运算符
规定了运算对象求值的顺序。 逗号运算符真正的结果是最右侧表达式的值
4.11类型转换
|