鱼C论坛

 找回密码
 立即注册
查看: 74|回复: 7

[已解决]++变量和变量++能放一块用吗?

[复制链接]
发表于 6 天前 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
已知 表达式 c = ++(a++) 是不合法的,且
int a = 5;
int b = a++;  // b 的值为 5,a 的值变为 6

int c = 5;
int d = ++c;  // d 的值为 6,c 的值变为 6
那么 表达式c=(++a)++对吗
最佳答案
6 天前
Gankdudu 发表于 2025-02-17 16:50
FishC 发表于 2025-2-17 16:40
不,不是这样的。表达 ...


是的,赋值操作符两侧有明确的要求:

1. 赋值操作符 `=` 左侧必须是一个左值(lvalue),即一个可以存储值的变量。
2. 赋值操作符 `=` 右侧可以是任何表达式,包括左值(lvalue)和右值(rvalue)。

这意味着你不能在赋值操作中把右值放在赋值操作符的左侧。右值不能存储值,因此不能出现在赋值操作符的左侧。

总结就是:左侧必须是可以存储值的实体,右侧可以是任意表达式。

示例代码:
// 合法示例
int a = 5;
int b;
b = a; // 左侧是左值,右侧是左值,合法

b = 10; // 左侧是左值,右侧是右值,合法

// 不合法示例
10 = a; // 左侧是右值,非法

b++ = a; // 左侧是右值,因为 b++ 的结果是右值,非法

希望这能帮助你理解赋值操作符的使用规则。如果有其他疑问,请继续提问!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 6 天前 | 显示全部楼层
表达式 `c = (++a)++` 不合法。

这是因为 (++a) 是一个表达式,它的结果是一个 右值(rvalue),即它仅仅是一个值,并不能用来存储数据。而后缀自增操作符 ++ 只能作用于可以存储值的左值(lvalue)。

换句话说,(++a) 的结果不能再被当作可以自增的实体来操作。

总结:
  • c = a++; 合法。
  • c = ++a; 合法。
  • c = (++a)++; 不合法。
  • c = a+++b; 合法,但容易令人困惑,不推荐写法。


以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 6 天前 | 显示全部楼层
FishC 发表于 2025-2-17 16:32
表达式 `c = (++a)++` 不合法。

这是因为 (++a) 是一个表达式,它的结果是一个 右值(rvalue),即它仅 ...

那么 c=++a=b++合法吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 6 天前 | 显示全部楼层
Gankdudu 发表于 2025-02-17 16:36
FishC 发表于 2025-2-17 16:32
表达式 `c = (++a)++` ...


我们将表达式 `c = ++a = b++` 分开来看:

1. `b++` 是一个后缀自增操作,表示先使用 `b` 的值,然后再进行自增。它的结果是一个右值(rvalue)。
2. `++a` 是一个前缀自增操作,表示先进行自增,然后再使用 `a` 的新值。它的结果是一个左值(lvalue)。
3. `c = value` 是赋值操作,表示将 `value` 赋值给 `c`。

因为 `b++` 返回的是一个右值,而赋值操作的右边必须是一个左值。因此,表达式 `c = ++a = b++` 不合法。

总结:

  • `c = a++;` 合法。
  • `c = ++a;` 合法。
  • `c = (++a)++;` 不合法。
  • `c = a+++b;` 合法,但不推荐这种写法。
  • `c = ++a = b++;` 不合法。


以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 6 天前 | 显示全部楼层
FishC 发表于 2025-2-17 16:36
我们将表达式 `c = ++a = b++` 分开来看:

1. `b++` 是一个后缀自增操作,表示先使用 `b` 的值,然 ...

也就是说  b++=d=++a 合法?右值出现在赋值运算符左侧,左值放右侧?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 6 天前 | 显示全部楼层
Gankdudu 发表于 2025-02-17 16:40
FishC 发表于 2025-2-17 16:36
我们将表达式 `c = ++ ...


不,不是这样的。表达式 `b++ = d = ++a` 不合法。

我们通过分析 `b++` 和赋值运算符来理解:

1. `b++` 是一个后缀自增操作,表示先使用 `b` 的值,然后再进行自增。它的结果是一个右值(rvalue)。
2. `d = ++a` 是表示先对 `a` 进行前缀自增操作,然后将结果赋值给 `d`。其中 `++a` 的结果是一个左值(lvalue),所以 `d = ++a` 是合法的。

但是在 `b++ = d = ++a` 表达式中,`b++` 返回的是一个右值,而赋值操作的左边必须是一个左值。因此,`b++` 不能出现在赋值运算符的左侧。

总结:

`c = a++;` 合法。
`c = ++a;` 合法。
`c = (++a)++;` 不合法。
`c = a+++b;` 合法,但不推荐这种写法。
`c = ++a = b++;` 不合法。
`b++ = d = ++a;` 不合法。

希望这能帮助你理解赋值运算符的使用规则。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 6 天前 | 显示全部楼层
FishC 发表于 2025-2-17 16:40
不,不是这样的。表达式 `b++ = d = ++a` 不合法。

我们通过分析 `b++` 和赋值运算符来理解:

所以说赋值操作符左右两侧不能同时出现左值、右值,必需在左侧是可存储的变量对吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 6 天前 | 显示全部楼层    本楼为最佳答案   
Gankdudu 发表于 2025-02-17 16:50
FishC 发表于 2025-2-17 16:40
不,不是这样的。表达 ...


是的,赋值操作符两侧有明确的要求:

1. 赋值操作符 `=` 左侧必须是一个左值(lvalue),即一个可以存储值的变量。
2. 赋值操作符 `=` 右侧可以是任何表达式,包括左值(lvalue)和右值(rvalue)。

这意味着你不能在赋值操作中把右值放在赋值操作符的左侧。右值不能存储值,因此不能出现在赋值操作符的左侧。

总结就是:左侧必须是可以存储值的实体,右侧可以是任意表达式。

示例代码:
// 合法示例
int a = 5;
int b;
b = a; // 左侧是左值,右侧是左值,合法

b = 10; // 左侧是左值,右侧是右值,合法

// 不合法示例
10 = a; // 左侧是右值,非法

b++ = a; // 左侧是右值,因为 b++ 的结果是右值,非法

希望这能帮助你理解赋值操作符的使用规则。如果有其他疑问,请继续提问!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-2-23 19:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表