`
狼牙_
  • 浏览: 7357 次
  • 性别: Icon_minigender_1
最近访客 更多访客>>
社区版块
存档分类
最新评论

a++为什么不能做左值

    博客分类:
  • c++
阅读更多

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(第四版)》。

 

 

  1. //例程2:给函数的返回值赋值  
  2. #include <iostream>  
  3. #include<string>  
  4. using namespace std;  
  5. char &get_val(string &str, string::size_type ix)  
  6. {  
  7.     return str[ix];  
  8. }  
  9.   
  10. int main()  
  11. {  
  12.     string s("a value");  
  13.     cout<<s<<endl;  //输出 a value  
  14.     get_val(s,0)='A';   //函数调用一般是不能作为赋值运算的左值的,但这儿居然没有错,只因为返回值为引用  
  15.     cout<<s<<endl;  //输出为 A value,不可思议的改变  
  16.     system("pause");  
  17.     return 0;  
  18. }  

 

正如注释中所讲,返回值为引用,函数调用get_val(s,0)居然可以作为赋值表达式的左值,就这样,其引用的空间(s[0])中所存储的字符被赋值为‘A’,“引用是被返回元素的同义词”,此处完全等同于s[0]='A'。

 

  程序从语法上讲没有问题,运行结果也达到了举例的目的。本例仅在于展示这种用法,理解引用作为函数返回值。在工程中,这种风格的程序当然不推荐使用,当不希望引用返回值被修改时,将返回值声明为const,即:

 

  const char &get_val(string &str, string::size_type ix)

 

分享到:
评论

相关推荐

    C++11中的左值引用和右值引用

     便捷方法:对表达式取地址,如果能,则为左值,否则为右值  举例:  int a = 10  int b = 20  int *pFlag = &a  vector&lt;int&gt; vctTemp  vctTemp.push_back(1)  string str1 = "hello"  string str...

    IT笔试题 腾讯

    - C) `(a++) += a`:错误,因为左侧(a++)不是一个有效的左值,不能进行赋值操作。 - D) `(++a) += (a++)`:先执行++a,a变为7,然后(a++)+=7,所以a=14。 2. `sizeof`运算符: - sizeof(str):计算字符串数组的...

    c++相关笔试题c++相关笔试题

    - (C) `(a++) += a`:错误,因为左侧`(a++)`不是一个有效的左值,不能进行赋值操作。如果修正为`(++a) += a`,则先将`a`增加到5,然后将5与5相加赋值给`a`,`a`最终值为10。 - (D) `(++a) += (a++)`:先执行`++a`...

    腾讯2021实习生校园招聘后台笔试题参考.pdf

    - (C) (a++) += a:错误,因为左侧(a++)不是一个有效的左值,不能进行赋值操作。 - (D) (++a) += (a++):同样错误,但修改后变为(++a) += a,a先自增为5,然后加上5,a的值为10。 2. sizeof运算符: sizeof运算符...

    c/c++笔试题目汇总

    - (C) `(a++) += a`:错误,因为左侧的(a++)不是一个有效的左值,不能进行赋值操作。 - (D) `(++a) += (a++)`:先进行++a操作,a变为5,然后a自增为6,a+=7,a最终为13。 2. sizeof运算符: sizeof运算符用于...

    华为C++笔试题下载分享

    `:错误,因为左侧的`(a++)`不是一个有效的左值,不能进行赋值操作。可以修改为`(++a) += a;`,这样`a`先增加到5,然后增加`a`的值,使`a`最终为10。 - (D) `(++a) += (a++)`:同样错误,`a`的值会变得不确定,因为...

    《C语言学习笔记》运算符和表达式 (1)1

    `++`和`--`是自增和自减运算符,它们会改变变量的值,如`A++`得到11,`A--`得到9。 2. 关系运算符:包括`==`、`!=`、`&gt;`、`、`&gt;=`和`。比如,`(A == B)`不为真,`(A != B)`为真,`(A &gt; B)`不为真,`(A )`为真,`(A ...

    C++笔试题华为.doc

    (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&C++笔试题(附答案)

    (C) `(a++) += a`:这个表达式是错误的,因为(a++)不是一个有效的左值,不能用于赋值操作。改正后应该是(++a) += a,这样先将a自增为5,然后将5加到a上,a的值变为10。 (D) `(++a) += (a++)`:这个表达式也是...

    钱能C++程序设计教程第二版(笔记2).pdf

    6. **后置自增运算符++**:后置自增运算符如`a++`,返回的是原始的`a`值,而不是增加后的值,因此不能作为左值使用。 7. **副作用(Side Effects)**:表达式中修改变量的值可能会导致副作用。为避免这种问题,应将...

    2009-2011腾讯校园招聘笔试题总结

    - (C) `(a++) += a`:错误,因为(a++)不是一个有效的左值,不能用于赋值操作。 - (D) `(++a) += (a++)`:同样错误,原因同(C)。正确做法是`(++a) += a`,a最终变为11。 2. sizeof运算符的使用: - `sizeof(str)`...

    华为C++笔试题(附答案)

    改正后 `(D) (++a) += (a++)`,`++a` 先自增,然后赋值,最后 `a++`,`a` 的最终值为 11。 2. `sizeof` 运算符: - `sizeof(str)` 计算字符串常量的长度,包括结束符 `\0`,所以其值为 17。 - `sizeof(p)` 返回...

    华为笔试 华为笔试.doc华为笔试.doc

    - `(C)` `(a++) += a`:错误,因为左侧`(a++)`不是一个有效的左值,不能作为赋值的目标。 - `(D)` `(++a) += (a++)`:先执行`++a`,`a`变为5,然后执行`(a++)`,将`a`的值增加1,但旧值5参与运算,所以`a`的最终值...

    华为C/C++类笔试/面试题

    `存在语法错误,因为等号左边的表达式`(a++)`不是一个有效的左值,无法进行赋值操作。正确的形式应该是`a++`或`++a`这样的形式。 - 最后,对于选项D,`(++a) += (a++);`中,首先`++a`会使a自增1变为5,然后将a的当前值(即...

    华为C笔试题(附答案).doc

    左侧不是一个有效的左值,不能进行赋值操作。 - 表达式(D): `(++a) += (a++)`,错误。与C类似,左侧不是一个有效的左值。 2. C++中的`sizeof`运算符: - `sizeof(str)`:在32位系统下,字符串常量包括末尾的空...

    最新C++面试题集 20008年10月

    `:错误,因为左侧的`(a++)`不是一个有效的左值,不能进行赋值操作。 - D) `[++a] += (a++)`:同样错误,原因同C。如果修复为`a += a++`或`a += ++a`,结果分别为10和11。 2. sizeof运算符: - sizeof(str):计算...

    趋势科技招聘经典软件笔试题--C++

    - 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的...

Global site tag (gtag.js) - Google Analytics