首页 > 试题广场 >

在下列表达式选项中,( )是正确。

[单选题]

在下列表达式选项中,正确的是()

  • ++(a++)
  • a++b
  • a+++b
  • a++++b
A错误,因为a++操作通过临时量返回其值,该值是一个常量,因此不能被修改(不是左值),而后缀++需要对左值进行操作,所以会引起编译错误。
所谓的左值,说通俗一点就是可以被修改和引用的值,左值可以取地址。与之相对的就是右值。在使用时,左值可以作为右值,但右值不能作为左值。

B、D的错误在于无法划分为有效的C/C++运算符

C当然是对的,至于是看作(a++)+b还是a+(++b),个人倾向于前者。因为在计算表达式时,应保证整个运算式的结合性一致。当遇到结合性不一致的情况时,一般会以圆括号包裹处理。这里+运算符为左结合性,前缀++为右结合性,后缀++为左结合性(C++中后缀运算符和单目运算符不仅优先级不同,结合性也不同,前缀++是单目运算符),所以从保持结合性一致出发,个人认为此处应看作(a++)+b。如果需要作为第二种表示,则需要添加圆括号。

相信很多小伙伴也尝试过,直接用编译器对答案进行验证,确实是(++)+。这是因为C/C++编译器在对程序编译时,会从左到右尽可能多的将字符组合成一个运算符或标识符,这就是通过编译器验证+++被分为(++)+的原因。
(个人认为这里和前后缀的优先级没太大关系,如有错误,还请指正!)
编辑于 2018-06-08 16:44:21 回复(3)
a++返回的是一个temp,并不是用户定义的那种可以引用、寻址的变量,不能对其操作,只能用来赋值
发表于 2018-05-30 13:50:54 回复(0)
a++返回右值,是拷贝;++a返回左值,是原值。所以不加优化++a理论更快。

a++是拷贝,所以不能继续操作;++a是a本身,所以可以继续++。

重载的时候++a是operator++(),a++是operator++(int)

选项对不对无关紧要了,脑子没点病不会这么写
编辑于 2022-04-08 18:07:27 回复(1)
有谭浩强内味了哈,茴香豆的写法🤮
发表于 2020-12-03 18:18:33 回复(0)
谁会写这样的代码啊😒
发表于 2020-09-21 14:40:11 回复(0)

a++的结果是a值的拷贝,而不是变量本省,你无法向一个值进行赋值


发表于 2019-04-27 09:55:02 回复(0)
a+++b→(a++)+b 。 ++(a++)是错的。 (++a)++是对的。 愚见。 来个大神发个完整的。
编辑于 2018-05-11 11:50:30 回复(1)
有关前置++和后置++的相关问题:
1、C语言中,前置++/--和后置++/--,返回的都是右值是拷贝,也就是说(a++)++,++(a++)是错误的。
2、C++中,后置++/--,返回的都是右值是拷贝。前置++/--返回的是左,是自身引用,也就是说(a++)++,++(a++)也是错误的。但是(++a)++,++(++a)是正确的。
3、在C++中,从理论上讲,由于前置++/--返回的引用,不需要调用拷贝构造函数,所以前置++/--效率更高。
4、在C++中,前置++/--重载的是operator++(),后置++/--重载是operator++(int)。

编辑于 2023-05-02 16:20:22 回复(0)
C++primer书上在说前置和后置版本的递增和递减时提到了,这两种版本的运算符必须作用于左值运算对象,前置版本将对象作为左值返回,后置版本则将对象原始值的副本作为右值返回。

发表于 2018-10-11 15:11:49 回复(0)
说下c选项吧,后缀++是第2优先级,前缀++是第3优先级,+加法运算符是第3优先级,因此a+++a实际会解释成(a++)+a
发表于 2021-04-01 19:41:42 回复(0)

a++通过一个临时量temp返回其中值,该值是一个常量,并不是用户定义的那种可以引用,寻址的变量,不能对其***作,只能用来赋值
发表于 2018-09-23 22:00:51 回复(0)
这种题目没有意义
发表于 2022-09-13 11:30:42 回复(0)
++++a呢?

发表于 2022-09-07 10:48:13 回复(0)
a++返回的是一个temp,并不是用户定义的那种可以引用、寻址的变量,不能对其操作,只能用来赋值
发表于 2024-09-12 13:05:02 回复(0)
a++返回值为临时常量,不可自增
发表于 2024-07-24 00:48:44 回复(0)
A选项违反了序列点规则
发表于 2024-07-19 16:27:59 回复(0)
关于a+++b,  a+++++b,等等
在《C专家编程》45页,有过详细说明,此类问题ANSI C 规定“maximal munch strategy”  ,如果下一个标记有超过一种解释方案,编译器将选取能组成最长字符序列的方案
也就是说,a+++b==(a++)+b,a+++++b==((a++)++)+b
发表于 2024-06-13 09:57:34 回复(0)
A是错的,常量不能自增
发表于 2023-05-12 10:42:45 回复(0)
A错误,因为a++操作通过临时量返回其值,该值是一个常量,因此不能被修改(不是左值),而后缀++需要对左值进行操作,所以会引起编译错误。 所谓的左值,说通俗一点就是可以被修改和引用的值,左值可以取地址。与之相对的就是右值。在使用时,左值可以作为右值,但右值不能作为左值
发表于 2023-02-12 22:47:56 回复(0)
在C语言中常量不能进行自增自减运算,a++运算后是将运算后的常量进行返回值操作,此时是常量,所以++(a++)运算后出现++常量的情况所以不正确
发表于 2022-08-24 09:25:24 回复(0)