++a和a++不是左值

转自  http://blog.csdn.net/todd911/article/details/8860960

[cpp] view plaincopy

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main(void){
  4. int i=0,j=0;
  5. i++ = 10;
  6. ++j = 10;
  7. return EXIT_SUCCESS;
  8. }

上面的编译时会出现一下错误:

aplus2.c:6:6: error: lvalue required as left operand of assignment
aplus2.c:7:6: error: lvalue required as left operand of assignment

意思就是等号左侧应该是应该是一个变量

书上有这个几句话:

前缀和后缀形式的增值操作符都赋值一份变量值的拷贝,用于周围表达式的值正是这份拷贝。

前缀操作符在进行赋值之前增加变量的值,后缀操作符在进行赋值之后才增加变量的值。

//不是太明白

对于这几句话,我的理解是:

比如i++ = 10这句,先将i的值进行复制到i++(可以将i++看成值10的别名),然后再对i加1,所以这句语句执行完后,i的值是11,而i++的值是10。

同理,++i = 10这句,先对i加1,然后再将i的值复制到++i(可以将++i看成值11的别名),所以这句语句执行完后,i和++i的值是11。

++i和i++的结果是i值的拷贝,并不是变量本身,所以无法向一个值进行赋值。

时间: 2024-10-05 23:09:19

++a和a++不是左值的相关文章

函数返回值当左值的问题

#include<iostream> using namespace std; int &get1() { static int a = 10; return a; } int &get2() { int b = 11; return b; } int &get3() { int *c = new int; *c = 10; return *c; } //说局部变量是不能作为引用返回的 int main() { int a1, b1,c1; a1 = get1(); b

(C++)关于i++和i++的左值、右值问题

1.什么是左值和右值? 左值就是出现在表达式左边的值(等号左边),可以被改变,他是存储数据值的那块内存的地址,也称为变量的地址: 右值是指存储在某内存地址中的数据,也称为变量的数据. 左值可以作为右值,但右值不可以是左值. 因此也只有左值才能被取地址. 2.举两个问题: int i = 0; (i++)+=i; //错误 (++i)+=i; //正确 int *ip = &(i++); //错误 int *ip = &(++i); //正确 3.为什么i++不能作左值? 我们来看i++和i

c++中的左值与右值

++(a++) a++相当于 int a; { int temp=a; a++; teturn temp; } 所以我们可以将++(a++)看成++temp;而temp 显然是一个右值,所以不能用啊~~ L-value中的L指的是Location,表示可寻址.The "l" in lvalue can be though of as locationR-value中的R指的是Read,表示可读.The "r" in rvalue can be thought of

c++ 基础学习: 左值 概念cocos2d-x3.0的实际应用

左值:概念baidu 1.2.6.2 与Cocos2d-x内存管理的结合 在2.x的使用场景中,CCArray和CCDictionary通常被分配在堆上,我们不得不需要考虑在适当的地方释放其内存.新的容器类不再继承自Ref(2.x中的CCObject),新的容器类通常应该被分配在栈上来使用,这简化了内存管理,我们应该将精力放在容器元素而不是容器本身的内存管理上. Vector中的T和Map<K,V>中的V必须是Ref类型,因为它们需要结合Cocos2d-x的内存管理方式一起工作.这简化了容器中

C语言 左值、右值

左值就是在赋值中可以放在赋值操作符两边的值 右值则是只可以放在赋值操作符右边的值 ++i是直接给i变量加1,然后返回i本身,因为i是变量,所以可以被赋值,因此是左值表达式i++现产生一个临时变量,记录i的值,而后给i加1,接着返回临时变量,然后临时变量不存在了,所以,不能再被赋值,因此是右值表达式

左值右值

左值就是可以放在赋值号左边赋值的,必须要在内存有实体 右值就是可以放在赋值号右边取出值赋给其他变量的值,可以在内存,也可以在CPU 引用说明为对象建立引用名,即别名 引用在定义初始化时与对象名绑定,程序中不能对引用重定义 一个对象的别名,从使用方式和效果上,与使用对象名一致 定义形式:类型&引用名=对象名; //引用可以改变指针的指向 //引用可以改变指针指向的值 1 #include <iostream> 2 using namespace std; 3 4 void main()

error C2662 无法将左值绑定到右值 —— 变量永远是左值,即使它的类型为右值引用

1 #include <utility> 2 3 struct A 4 { 5 void f() && { } 6 }; 7 8 void g(A &&a) 9 { 10 a.f(); //error, a是左值 11 std::move(a).f(); //fine 12 } 13 14 int main() { return 0; } 其实有了右值表示临时对象这一观察结果,变量是左值这一特性并不令人惊讶.毕竟,变量是持久的,直到离开作用域时才被销毁.(<

C 语言中的左值和右值。以及对比数组名和指针取数组元素的区别。

左值:出现在赋值符左边的符号有时称为左值. 右值:出现在赋值符右边的符号有时称为右值. 编译器为每个变量分配一个地址(左值),这个地址在编译时可知,而且该变量在运行时一直保存于这个地址.相反,存储于变量中的值(它的右值)只有在运行时才可知.如果需要用到变量中存储的值,编译器就发出指令从指定地址读入变量值并将它存于寄存器. 可以看到,每个符号的地址在编译时可知. 对比一下几个式子: //常规变量 int a=1;//这里a作为左值出现,代表的是地址,即在a表示的这个内存地址存入数值1.即a代表的内

C++11之右值引用:从左值右值到右值引用

C++98中规定了左值和右值的概念,但是一般程序员不需要理解的过于深入,因为对于C++98,左值和右值的划分一般用处不大,但是到了C++11,它的重要性开始显现出来. C++98标准明确规定: 左值是可以取得内存地址的变量. 非左值即为右值. 从这里可以看出,可以执行&取地址的就是左值,其他的就是右值. 这里需要明确一点,能否被赋值不是区分C++左值和右值的区别. 我们给出四个表达式: string one("one"); const string two("two&

4.1 中的左值和右值

摘要:  引自---http://www.cnblogs.com/catch/p/3500678.html 左值 (lvalue)和右值 (rvalue) 是 c/c++ 中一个比较晦涩基础的概念,有的人可能甚至没有听过,但这个概念到了 c++11 后却变得十分重要,它们是理解 move, forward 等新语义的基础. 左值右值的定义 左值与右值这两概念是从 c 中传承而来的,在 c 中,左值指的是既能够出现在等号左边也能出现在等号右边的变量(或表达式),右值指的则是只能出现在等号右边的变量