b = a++ 相当于 b = a, a = a + 1
b = ++ a 相当于a = a +1, b = a
为什么a++不能做左值
a++返回的是自身的值副本,所以不能作为左值
int int::operator++(int)
{
int oldvalue = *this;
++*this;
return oldvalue;
}
++a 返回的是a加1后自身的引用
int& int::operator ++()
{
*this = *this+1;
return *this;
}
一个令人惊讶的程序:给函数的返回值赋值
这个例子来自《C++ Primer(第四版)》。
- //例程2:给函数的返回值赋值
- #include <iostream>
- #include<string>
- using namespace std;
- char &get_val(string &str, string::size_type ix)
- {
- return str[ix];
- }
- int main()
- {
- string s("a value");
- cout<<s<<endl; //输出 a value
- get_val(s,0)='A'; //函数调用一般是不能作为赋值运算的左值的,但这儿居然没有错,只因为返回值为引用
- cout<<s<<endl; //输出为 A value,不可思议的改变
- system("pause");
- return 0;
- }
正如注释中所讲,返回值为引用,函数调用get_val(s,0)居然可以作为赋值表达式的左值,就这样,其引用的空间(s[0])中所存储的字符被赋值为‘A’,“引用是被返回元素的同义词”,此处完全等同于s[0]='A'。
程序从语法上讲没有问题,运行结果也达到了举例的目的。本例仅在于展示这种用法,理解引用作为函数返回值。在工程中,这种风格的程序当然不推荐使用,当不希望引用返回值被修改时,将返回值声明为const,即:
const char &get_val(string &str, string::size_type ix)
相关推荐
便捷方法:对表达式取地址,如果能,则为左值,否则为右值 举例: int a = 10 int b = 20 int *pFlag = &a vector<int> vctTemp vctTemp.push_back(1) string str1 = "hello" string str...
- C) `(a++) += a`:错误,因为左侧(a++)不是一个有效的左值,不能进行赋值操作。 - D) `(++a) += (a++)`:先执行++a,a变为7,然后(a++)+=7,所以a=14。 2. `sizeof`运算符: - sizeof(str):计算字符串数组的...
- (C) `(a++) += a`:错误,因为左侧`(a++)`不是一个有效的左值,不能进行赋值操作。如果修正为`(++a) += a`,则先将`a`增加到5,然后将5与5相加赋值给`a`,`a`最终值为10。 - (D) `(++a) += (a++)`:先执行`++a`...
- (C) (a++) += a:错误,因为左侧(a++)不是一个有效的左值,不能进行赋值操作。 - (D) (++a) += (a++):同样错误,但修改后变为(++a) += a,a先自增为5,然后加上5,a的值为10。 2. sizeof运算符: sizeof运算符...
- (C) `(a++) += a`:错误,因为左侧的(a++)不是一个有效的左值,不能进行赋值操作。 - (D) `(++a) += (a++)`:先进行++a操作,a变为5,然后a自增为6,a+=7,a最终为13。 2. sizeof运算符: sizeof运算符用于...
`:错误,因为左侧的`(a++)`不是一个有效的左值,不能进行赋值操作。可以修改为`(++a) += a;`,这样`a`先增加到5,然后增加`a`的值,使`a`最终为10。 - (D) `(++a) += (a++)`:同样错误,`a`的值会变得不确定,因为...
`++`和`--`是自增和自减运算符,它们会改变变量的值,如`A++`得到11,`A--`得到9。 2. 关系运算符:包括`==`、`!=`、`>`、`、`>=`和`。比如,`(A == B)`不为真,`(A != B)`为真,`(A > B)`不为真,`(A )`为真,`(A ...
(C) `(a++) += a`:错误,左侧不是一个有效的左值(即不能赋值的表达式)。 (D) `(++a) += (a++)`:先执行前缀自增 `(++a)`,将a设为6,然后执行后缀自增 `(a++)`,此时a为7,加法操作后a的值为11。 2. `sizeof`...
(C)错误,因为`(a++)`不是一个左值,不能作为赋值操作的目标;(D)的正确形式应为`(a++) += a`,这样`a`最终为11。 2. `sizeof`运算符: `sizeof`用于计算对象或类型的大小。在32位系统下,(1)`str`是一个字符串...
(C) `(a++) += a`:这个表达式是错误的,因为(a++)不是一个有效的左值,不能用于赋值操作。改正后应该是(++a) += a,这样先将a自增为5,然后将5加到a上,a的值变为10。 (D) `(++a) += (a++)`:这个表达式也是...
6. **后置自增运算符++**:后置自增运算符如`a++`,返回的是原始的`a`值,而不是增加后的值,因此不能作为左值使用。 7. **副作用(Side Effects)**:表达式中修改变量的值可能会导致副作用。为避免这种问题,应将...
- (C) `(a++) += a`:错误,因为(a++)不是一个有效的左值,不能用于赋值操作。 - (D) `(++a) += (a++)`:同样错误,原因同(C)。正确做法是`(++a) += a`,a最终变为11。 2. sizeof运算符的使用: - `sizeof(str)`...
改正后 `(D) (++a) += (a++)`,`++a` 先自增,然后赋值,最后 `a++`,`a` 的最终值为 11。 2. `sizeof` 运算符: - `sizeof(str)` 计算字符串常量的长度,包括结束符 `\0`,所以其值为 17。 - `sizeof(p)` 返回...
- `(C)` `(a++) += a`:错误,因为左侧`(a++)`不是一个有效的左值,不能作为赋值的目标。 - `(D)` `(++a) += (a++)`:先执行`++a`,`a`变为5,然后执行`(a++)`,将`a`的值增加1,但旧值5参与运算,所以`a`的最终值...
`存在语法错误,因为等号左边的表达式`(a++)`不是一个有效的左值,无法进行赋值操作。正确的形式应该是`a++`或`++a`这样的形式。 - 最后,对于选项D,`(++a) += (a++);`中,首先`++a`会使a自增1变为5,然后将a的当前值(即...
左侧不是一个有效的左值,不能进行赋值操作。 - 表达式(D): `(++a) += (a++)`,错误。与C类似,左侧不是一个有效的左值。 2. C++中的`sizeof`运算符: - `sizeof(str)`:在32位系统下,字符串常量包括末尾的空...
`:错误,因为左侧的`(a++)`不是一个有效的左值,不能进行赋值操作。 - D) `[++a] += (a++)`:同样错误,原因同C。如果修复为`a += a++`或`a += ++a`,结果分别为10和11。 2. sizeof运算符: - sizeof(str):计算...
- A: a += (a++) 结果为9,a的值为5。 - B: a += (++a) 结果为10,a的值为6。 - C: (a++) += a; 错误,左侧不是一个有效的左值。 - D: (++a) += (a++); 改为:(a++) += a; 结果为11,a的值为7。 2. sizeof的...