精华内容
下载资源
问答
  • 想给一个指向int型的指针赋值,以下代码,就会在第三行报错“表达式必须为左值或者函数操作符” int *P; int a; p=&(a+2); 改写成以下代码就不会报错了 int *P; int a,b; b=a+2; p=&b; ...

    问题描述:

    想给一个指向int型的指针赋值,以下为代码,就会在第三行报错“表达式必须为左值或者函数操作符”

    int *P;
    int a;
    p=&(a+2);

    改写成以下代码就不会报错了

    int *P;
    int a,b;
    b=a+2;
    p=&b;

    当然,也可以写成下面的代码,因为在给指针赋值的时候,当等号左边为*p的时候改变的就是指针指向的值。 

    int *P;
    int a;
    *P=a+2;

    问题分析:

     分析一下为什么第一种写法就是错的, 究其原因就是取地址操作符&必须作用于一个左值,而(a+2)明显是一个表达式,不是一个合法的左值,当然要报错了。

    左值与右值这两概念是从 c 中传承而来的,在 c 中,左值既能够出现在等号左边也能出现在等号右边,右值则是只能出现在等号右边。右值就是一个临时变量(没有在程序中申明),只有临时的地址空间,左值是在程序中具体定义了的,有其地址空间。换句话说,使用取地址符&对某个值取地址,左值能够得到地址,而右值不能得到地址!

     

    展开全文
  • 想给一个指向int型的指针赋值,以下代码,就会在第三行报错“表达式必须为左值或者函数操作符” int *P; int a; p=&(a+2); `改写成以下代码就不会报错了`` ```cpp int *P; int a,b; b=a+2; p=&b; 当然,...

    问题描述:
    想给一个指向int型的指针赋值,以下为代码,就会在第三行报错“表达式必须为左值或者函数操作符”

    int *P;
    int a;
    p=&(a+2);
    `改写成以下代码就不会报错了``
    ```cpp
    int *P;
    int a,b;
    b=a+2;
    p=&b;
    

    当然,也可以写成下面的代码,因为在给指针赋值的时候,当等号左边为*p的时候改变的就是指针指向的值。

    int *P;
    int a;
    *P=a+2;
    
    	double *Parameters[4] = { 0,0,0,0 };
    	Parameters[0]=&V(0, 2);//平面方程参数A
    	Parameters[1] = &V(1, 2);//平面方程参数B
    	Parameters[2] = &V(2, 2); //平面方程参数C
    	double V4 = -1 * (*Parameters[0] * ave_x + *Parameters[1] * ave_y + *Parameters[2] * ave_z);
    	Parameters[3] = &V4;//平面方程参数D
    

    问题分析:
    分析一下为什么第一种写法就是错的, 究其原因就是取地址操作符&必须作用于一个左值,而(a+2)明显是一个表达式,不是一个合法的左值,当然要报错了。
    左值与右值这两概念是从 c 中传承而来的,在 c 中,左值既能够出现在等号左边也能出现在等号右边,右值则是只能出现在等号右边。右值就是一个临时变量(没有在程序中申明),只有临时的地址空间,左值是在程序中具体定义了的,有其地址空间。换句话说,使用取地址符&对某个值取地址,左值能够得到地址,而右值不能得到地址!

    展开全文
  • 小白弱弱地问一下,在c++中,赋值表达式是先计算出右值,赋给左值,还是先计算左值,再将右值赋值给它呢? 比如 int count = 0; arr[count] = list[count++]; 这种,是先计算右边的count++, 然后左边的count...
  • 关于C++表达式左值

    2019-09-22 19:06:11
    其实是C++某些运算符的强制规定,例如内置赋值运算符、前置增量和前置减量运算符等等,这类运算符的结果被强制规定为左值,对于条件运算符,只有第二和第三表达式为左值且类型相同时才保证结果为左值。...

    表达式是否保留左值性视需要而定,这个“需要”是什么?

    其实是C++某些运算符的强制规定,例如内置赋值运算符、前置增量和前置减量运算符等等,这类运算符的结果被强制规定为左值,对于条件运算符,只有第二和第三表达式皆为左值且类型相同时才保证结果为左值。原因无它,仅仅规定而已。逗号表达式的结果是其最右边表达式的值。如果最右边的操作数是左值,则逗号表达式的值也是左值

    转载于:https://www.cnblogs.com/ForFreeDom/archive/2012/04/15/2450426.html

    展开全文
  • 左值左值表达式左值引用 C++

    千次阅读 多人点赞 2019-06-25 20:10:31
    什么是左值表达式、右值表达式 引用的分类 之前学习Java的时候只记得在赋值表达式左边的就是左值,右边的就是右值。这个说法没有错,但今天又在C++中有学习到了关于左右值得概念,在此梳理了一些这些知识点。 ...

    本文topics

    1. 什么是左值和右值
    2. 什么是左值表达式、右值表达式
    3. 引用的分类

    之前学习Java的时候只记得在赋值表达式左边的就是左值,右边的就是右值。这个说法没有错,但今天又在C++中有学习到了关于左右值得概念,在此梳理了一些这些知识点。

    左值和右值
    左值:左值是一个对象或变量,可以代表着一个固定地址。

    int i = 1;//此时,i是个变量,本质和对象一样,是一块内存区域,代表着一个固定的地址。
    

    右值:不能作为左值的都是右值,要么是一个常量,要么就是一个使用一次立即被销毁的临时变量或临时对象,右值没有固定的地址,使用完立即被释放。

    int i = 1 ; //1 是一个右值,没有固定地址,虽然它也占内存,但用完就被立即释放
    

    这里必须再提醒一下,左值也可以同时拥有右值属性,但反过来不行。

    i =i+5;//这里右边的虽然是个左值,但在这里有右值属性,可以理解为取出i的值和1相加构成一个值为(x+1)的常数(或者说临时变量)
    

    了解了什么是左值和右值,那么哪些地方可以用到呢?
    这里举介个常见运用左值的运算符的例子
    这些运算符都必须运用左值,无法用右值来运算。这里举几个常见的例子

    • 赋值运算符的左侧必须是左值,这个不用说应该都能理解
    • 取值符号&
    int i = 1;
    int* ptr = &i;//这里i必须是个左值
    
    • 容器的下标 [ ]
    string s=“daily coding";
    cout<<s[1]<<endl;//这里下标运算符的左边必须是左值
    
    • ++,- -等。这里有统一方法可以看一个运算符是不是必须用左值。就是看这个运算符能不能操作字面值,如果不可以,就是左值运算符。
    3++;//错误,这种直接操作一个字面量显然不行,所以++是必须运用左值的运算符
    

    左值表达式和右值表达式
    这个很好理解,一个表达式的求值结果如果是左值,就是左值表达式,否则如果是右值,就是右值表达式

    int i = 1;
    ++i = i+2;
    //这里左边++i,是返回一个i的变量,但i的值增加了1,所以是左值表达式
    //这里i+1是一个右值表达式 ,因为它是一个存了3的临时地址,赋值给i++后就被释放了。
    
    i++ = i + 2;//错误,因为i++是一个右值表达式,这里可以理解为 有一个临时对象temp=i;i = i+1;然后返回temp,结果就等于 1  =i+1;所以显然不行 
    

    引用分类

    • 左值引用
      即绑定到左值的引用,必须绑定左值
    int i = 1;
    int &ref = i;//这里ref是绑定了i这个左值的引用
    int &ref2 = 3;// 3 是右值,无法绑定
    
    • 右值引用
      右值引用的作用是给开发者提供一个想要可以绑定临时变量的作用,可以通过右值引用符号“&&” 来实现
    int &&i=1;//右值引用可直接引用右值,可以理解为想要给 “ 1 ”一个固定的地址,并给与一个变量名i
    i = 3;//可以通过i再赋值
    
    • Const常量引用,本质上也是左值引用的一种,但区别有二
      一是无法通过这个引用改变引用地址的值,二是它可以间接绑定右值(实际上是绑定了一种左值)
    int i = 1;
    const int &ref = 1;
    i = 10;//错误,无法再赋值 ,因为ref是一个常量引用
    
    const int &ref2 = 100;//可以引用一个右值,本质上是将100转换为一个变量,再将ref2引用到这个变量上
    

    总结

    1. 左值是一个对象或变量,代表一个固定地址,而没有固定地址的临时对象或临时变量既是右值,不能代表一个固定地址
    2. 左值表达式就是一个值为左值的表达式,右值表达式就是值为右值的表达式
    3. 左值引用只能引用左值,右值因为只能引用右值,而const引用就可以同时引用左值和右值(通过临时变量间接引用右值,实际上是左值引用)
    展开全文
  • 当定义一个结构体,里面包含字符数组 此时,字符数组不能直接用 **=**号赋值,需要用strcpy来进行赋值。
  • C++表达式左值

    2017-11-18 09:18:12
    表达式 在C++中,任何值或者任何有效值和运算符号的组合都是表达式 。 对任何表达式加上分号都可以成为语句。 如: 当判断表达式的值这种...x=20//表达式的值20x二左值 可以通过以下两点来判定C++中的左值 1 有名
  • 转载自 飞天御剑流 的博客 ... C/C++左值性精髓 ...(二)哪些表达式左值,哪些是右值?...C++由于增加了引用类型,结果引用的函数调用表达式和强制转换表达式都属于左值,示例如下:   int& fun1( int & r
  • 表达式作为左值

    千次阅读 2018-09-28 20:30:09
    示例代码: #include using namespace std; ...1、第一个函数返回的是一个数,所以不能作为左值 ...2、第二个函数返回的是一个变量(a的引用),所以可以作为左值 3、修改函数的值就相当于修改a的值
  • 赋值表达式左值和右值

    千次阅读 2019-03-26 21:23:55
    一般出现在赋值表达式的左边,但也可以出现在赋值表达式的右边。其特点是有变量名即可通过地址访问并修改的内存块 右值 只能出现在赋值表达式的右边,特点是没有名字,即没有可访问的地址名,只有一个值 常规...
  • 上篇我们学习了变量以及变量的使用,这节课我们学习赋值运算符。例如我们声明一个变量:int _age=32;我们将数值32放入变量_age...左值必须能够被修改,不能是常量。这个是基本的赋值运算符。例如班级里a同学成绩是8...
  • <p>void Change(string &s,const string &oldVal,const string &newVal) {<!-- -->  auto l =...报错表达式必须是可修改的左值,把const string改成string仍然没有用。</p>
  • 在练习时遇到这个问题 struct CandyBar { char name[50]; double weight; int caloria; };...oid put_in(CandyBar& candy, char* name, double weight, int caloria) ...由于name是字符数组,不可直
  • VS2019定义类时说表达式必须是可修改的左值 本人下载了EasyX库,想写个按钮函数,结果在VS2019里编译说表达式必须是可修改的左值,求高人指点。 类的定义: class BUTTON { public: bool cilck(); void draw(); ...
  • 非常量引用的初始值必须为左值的问题 此博文包含图片 (2013-03-24 13:42:11)转载▼ 标签: c 指针 引用 首先,先看下面一个例子: eg.1 #include<iostream> usingnamespace std; int main(){ int i =2; ...
  • 代码如下,在一个类里定义了如下private型成员变量和成员函数,但是在成员函数里给vals赋值时会提示表达式必须是可修改的左值,请问是什么呢? private: char vals[3000]; int numDigits; BigInt multDigit...
  • 两个数组不能相互赋值,以及不能修改常量值
  • 左值引用先看一下传统的左值引用。...定义引用变量必须初始化,因为引用其实就是一个别名,需要告诉编译器定义的是谁的引用。int &var = 10;上述代码是无法编译通过的,因为10无法进行取地址操作,无法对...
  • 如何理解左操作数必须为左值

    千次阅读 2017-09-26 20:14:12
    声明:本博文用于学习总结及工作心得在C语言中经常会遇到一个问题就是做操作数必须为左值,看一下代码:int a=1,b=2;a;在C++编译器环境下,能正常运行,没有错误,但是在C编译器下却会报错: error C2106 “=”:做...
  • C语言中左值和右值概念是来自赋值或复合赋值表达式。初学者会很容易迷惑,这里给出这两个概念总结。...左值是指向内存区域的对象,左值可以出现赋值表达式的左边或右边,当左值出现的右边时,自动转换右值...
  • ![图片说明](https://img-ask.csdn.net/upload/201601/02/1451708611_417396.jpg) ![图片说明](https://img-ask.csdn.net/upload/201601/02/1451708623_906540.jpg) 是public变量 什么不能修改?
  • 非常量引用的初始值必须为左值,常量引用的初始值可以为左值、右值
  • 表达式左值右值

    2015-09-17 19:10:00
    左值右值是表达式的属性,该属性称为 value category。按该属性分类,每一个表达式属于下列之一: lvalue left value,传统意义上的左值 xvalue expiring value, x值,指通过“右值...
  • 注意1:1.num[10]是字符数组名,a[i].num指向字符常量,字符数组名是无法修改的. 2.所以可以用strcpy字符串复制功能就可以了. 3.另外写成s=a[i];也可以. 4.又或者将结构体内char num[10]改成...stdio.h>...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 23,009
精华内容 9,203
关键字:

表达式必须为左值