当一个对象用作右值的时候,用的是对象的值(内容),当对象被用作左值的时候,用的是对象的身份(在内存中的位置)
优先级固定了运算对象的组合方式,但是没有说明运算对象按照什么顺序求值。
int i = f1() * f2();
这里我们无法确定f1()和f2()谁先执行。只有四种运算明确制定了运算对象的求值顺序。
&& || :? ,
除法运算向0取整,取余运算结果符号与被除数一致。
赋值运算符满足右结合律
int val, *pval; val = pval = 0; //非法,int *不能赋值给int
- IO运算符满足左结合律
sizeof运算符返回一条表达式返回值类型或者一个类型所占的字节数,其中不对表达式求值。
sizeof *p
这里即使p是无效指针也没错,因为sizeof不需要真正解引用就可以得到所指对象的类型逗号运算符
int a, b = 3, c = 5; a = b, c; // a = 3; a = (b, c); // a = 5;
类型转换
static_cast
:任何具有明确定义的类型转换,只要不包含底层const,就可以用static_cast.int i = 2, j = 3; doubel slope = static_cast<double>(j) / i;
const_cast
:只能改变底层const(只能用来改变常量属性,不能改类型)const char *pc; char *p = const_cast<char*> (pc); //去掉const属性,不过通过p写值是未定义行为
reinerpret_cast
:为运算对象的位模式提供较低层次上的重新解释
4-表达式
最新推荐文章于 2020-05-23 16:29:40 发布