关于c++中,左值和右值问题
y=5*x++;这个表达式显然是正确的,但是--x--;表达式错误的原因,请达人帮忙解释一下在C++中,帮忙解释一下--x--不正确的原因。提示:从左值右值的角度...
y=5*x++;这个表达式显然是正确的,但是--x--;表达式错误的原因,请达人帮忙解释一下
在C++中, 帮忙解释一下--x--不正确的原因。
提示:从左值右值的角度 展开
在C++中, 帮忙解释一下--x--不正确的原因。
提示:从左值右值的角度 展开
5个回答
展开全部
++ --他们具有相同的优先级
所以 --x-- x两边的-- 就有相同的优先级,无法判断 先执行那边。
而5*x++;的 乘法 和 -- 优先级不一样,有先后
1级优先级 左结合
() 圆括号 [] 下标运算符 -> 指向结构体成员运算符 . 结构体成员运算符
2级优先级 右结合
! 逻辑非运算符 ~ 按位取反运算符 ++ 自增运算符 -- 自减运算符 - 负号运算符 (类型) 类型转换运算符 * 指针运算符 & 地址与运算符 sizeof 长度运算符
3级优先级 左结合
* 乘法运算符 / 除法运算符 % 取余运算符
4级优先级 左结合
+ 加法运算符 - 减法运算符
5级优先级 左结合
<< 左移运算符 >> 右移运算符
6级优先级 左结合
<、<=、>、>= 关系运算符
7级优先级 左结合
== 等于运算符 != 不等于运算符
8级优先级 左结合
& 按位与运算符
9级优先级 左结合
^ 按位异或运算符
10级优先级 左结合
| 按位或运算符
11级优先级 左结合
&& 逻辑与运算符
12级优先级 左结合
|| 逻辑或运算符
13级优先级 右结合
? : 条件运算符
14级优先级 右结合
=+ =- =* =/ =% = >= < <= &= ^= |= 全为赋值运算符
15级优先级 左结合
, 逗号运算符
所以 --x-- x两边的-- 就有相同的优先级,无法判断 先执行那边。
而5*x++;的 乘法 和 -- 优先级不一样,有先后
1级优先级 左结合
() 圆括号 [] 下标运算符 -> 指向结构体成员运算符 . 结构体成员运算符
2级优先级 右结合
! 逻辑非运算符 ~ 按位取反运算符 ++ 自增运算符 -- 自减运算符 - 负号运算符 (类型) 类型转换运算符 * 指针运算符 & 地址与运算符 sizeof 长度运算符
3级优先级 左结合
* 乘法运算符 / 除法运算符 % 取余运算符
4级优先级 左结合
+ 加法运算符 - 减法运算符
5级优先级 左结合
<< 左移运算符 >> 右移运算符
6级优先级 左结合
<、<=、>、>= 关系运算符
7级优先级 左结合
== 等于运算符 != 不等于运算符
8级优先级 左结合
& 按位与运算符
9级优先级 左结合
^ 按位异或运算符
10级优先级 左结合
| 按位或运算符
11级优先级 左结合
&& 逻辑与运算符
12级优先级 左结合
|| 逻辑或运算符
13级优先级 右结合
? : 条件运算符
14级优先级 右结合
=+ =- =* =/ =% = >= < <= &= ^= |= 全为赋值运算符
15级优先级 左结合
, 逗号运算符
展开全部
你可以试试这样两条语句:
--x++;//该语句报错是内容是'--' needs l-value
++x--;//该语句报错是内容是'++' needs l-value
你会发现编译器报错说的都是前面的那个运算符报错,前面那个运算符需要一个左值。
x++和x--都是在执行该条语句之后才改变值的。也就是说在该条语句执行完之前x++和x--都是一个右值。
所以当对一个右值前加或者前减的时候自然会报错。。。
--x++;//该语句报错是内容是'--' needs l-value
++x--;//该语句报错是内容是'++' needs l-value
你会发现编译器报错说的都是前面的那个运算符报错,前面那个运算符需要一个左值。
x++和x--都是在执行该条语句之后才改变值的。也就是说在该条语句执行完之前x++和x--都是一个右值。
所以当对一个右值前加或者前减的时候自然会报错。。。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你说的是什么意思啊,是不是把X++换成--X--啊,是的话就是歧义错误,要用()来作用处理的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
(--x)--等价于(x-1)--,等价于(x-1)=(x-1)-1;这显然是不行的,因为等号的左边必须是变量,而不能是表达式
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
--是左结合的,所以--x--等价于--(x--)。
x--返回x的拷贝,然后x自减1。
返回的拷贝属于右值,是不能改变的,所以错了。
而第一个表达式正式把它当右值,所以没错。
另外,根据优先级,第一个表达式相当于y=5*(x++)。
x--返回x的拷贝,然后x自减1。
返回的拷贝属于右值,是不能改变的,所以错了。
而第一个表达式正式把它当右值,所以没错。
另外,根据优先级,第一个表达式相当于y=5*(x++)。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询