赋值运算符的左侧运算对象必须是一个可修改的左值
如果左侧是内置类型,初始值列表最多只能包含一个值,转换后空间不大于目标空间
无论运算对象类型是什么,初始值列表都可以为空
赋值运算满足右结合律
int ival,jval;
ival = jval = 0;//正确:都被赋值为0
Int ival, *pval;
Ival = pval = 0;
//错误: 0赋给pval,pval是指针不能赋给ival
赋值运算优先级较低
Note:因为赋值运算符的优先级低于关系运算符的优先级,所以在条件语句中,赋值部分通常应该加上括号。
切勿混淆相等运算符和赋值运算符(=和==)
复合赋值运算符
递增运算符(++)
递减运算符(--)
int i=0, j =0;
j = ++I; // j=1,i=1:前置版本得到递增后的值 将对象本身作为左值返回
j = i++;// j =1,I =2:后置版本得到递增后的值 对象原始值的副本作为右值返回、
建议:除非必要,否则不用递增递减运算符的后置版本
在一条语句中混用解引用和递增运算符
在复合表达式既能将变量+1,-1 又能使用它原来的值,这时候可以用后置版本
auto pbeg = v.begin();
while (pbeg != v.end() && *pbeg >= 0)
cout << *pbeg++ << endl;
*pbeg++很普遍要理解
后置递增运算符的优先级高于解引用运算符
*pbeg++等价于 * (pbeg++)
Pbeg ++ 把 pbeg加1,然后返回pbeg初始值的副本作为其求值结果
建议:简洁可以成为一种美德
运算对象可按任意顺序求值
如果一条 子表达式改变某个运算对象的值
另一条 子表达式又要用该值的话,运算对象的求值顺序很关键
*beg = toupper(*beg++); //错误:未定义
如果先求左侧的值
*beg = toupper(*beg);
如果先求右侧的值
*(beg +1) = toupper(*beg);