Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么在C+中多次递增/递减有效+;但不是用C?_C++_C_Language Lawyer_Lvalue_Incompatibility - Fatal编程技术网

C++ 为什么在C+中多次递增/递减有效+;但不是用C?

C++ 为什么在C+中多次递增/递减有效+;但不是用C?,c++,c,language-lawyer,lvalue,incompatibility,C++,C,Language Lawyer,Lvalue,Incompatibility,测试(c/cpp) 但是,如果将其另存为.c文件,则会出现以下错误: test.c:7:12: error: lvalue required as decrement operator. (++a)操作不应该在(newValue)--操作之前解决吗?有人对此有什么见解吗?在C中,前缀和后缀递增/递减运算符的结果不是左值 在C++中,后缀增量/减量算子的结果也不是一个LValk,但是前缀增量/减量算子的结果是一个LValue/< 现在,在C++中做一些类似于(++)-的行为是未定义的行为,因为在

测试(c/cpp)

但是,如果将其另存为.c文件,则会出现以下错误:

test.c:7:12: error: lvalue required as decrement operator.

(++a)
操作不应该在
(newValue)--
操作之前解决吗?有人对此有什么见解吗?

在C中,前缀和后缀递增/递减运算符的结果不是左值

在C++中,后缀增量/减量算子的结果也不是一个LValk,但是前缀增量/减量算子的结果是一个LValue/< <>现在,在C++中做一些类似于(++)-<代码>的行为是未定义的行为,因为在两个序列点之间修改对象值两次。
编辑:跟进@bames53评论。在C++98/C++03中,这是未定义的行为,但C++11中对序列点的概念所做的更改现在使该表达式得以定义>算子和左值表达式的左侧。C++允许更多的事物成为LValk,因为它支持引用语义。
++ a = 3; /* makes sense in C++ but not in C. */
递增运算符和递减运算符与赋值运算符类似,因为它们修改其参数

在C++03中,
(++a)--
将导致未定义的行为,因为两个互不排序的操作正在修改相同的变量。(即使一个是“pre”而另一个是“post”,它们也是不排序的,因为没有
&&&
,或诸如此类。)


在C++11中,表达式现在执行您所期望的操作。但是C11没有改变任何这样的规则,这是一个语法错误。

§5.2.7递增和递减:

post fix
++
表达式的值是其操作数的值。[…]操作数应为可修改的左值


<>你在C编译中得到的错误有助于表明这只是C++中的一个特性。

对于任何想要在标准中陈述差异的精确细节的人来说,C99,Po.5.5.3/2说:

前缀++运算符的操作数值递增。结果是新的 递增后操作数的值

相比之下,C++11,§5.3.2/1说:

结果是更新后的操作数;它是一个左值,如果 操作数是位字段

[在这两种情况下都添加了强调语]

还要注意的是,尽管当
a
int
时,
(++a)--
给出了未定义的行为(至少在C++03中是这样),但如果
a
是某个用户定义的类型,那么您将使用自己的
++
-
重载,该行为将被定义——在这种情况下,您将得到以下等价物:

a.operator++().operator--(0);

由于每个操作符都会产生一个函数调用(不能重叠),因此您实际上有序列点来强制定义行为(请注意,我不建议使用它,只注意在本例中行为是实际定义的)。

b=(++a)--@LihO:为什么?
a
上的增量在其求值之前进行排序为什么不仅仅是
b=a+1
@和Y行:我总是避免在同一行中使用更多的增量前/增量后操作。。。我不想以这样的方式结束:
b=++a+++a,据我所知,这已经是UB了。我认为真正需要了解的是,C代码行数越少,程序运行速度就越快。最好写两三行。它更明显,更容易理解。我建议只在非常特殊的情况下使用预减量/增量,而只在非常特殊的情况下使用后减量/增量(即,您无法找到任何其他编写方法)。C++11取消了序列点,而只要求读取和修改按顺序进行,它们在
(++a)-
中。请参见不同意
(++a)--
定义良好的说法。bames53链接到的页面将应用于
-(++a)
,但增量后的页面没有相同的页面sequencing@M.M
(++a-->
中的
++a
的副作用按照C++11,5.17p1按照后缀
-->
排序:“在所有情况下,赋值都是在右操作数和左操作数的值计算之后,赋值表达式的值计算之前进行排序。”(使用5.3p2“如果x不是bool类型,表达式++x相当于x+=1”)。@ouah
++a
中涉及的赋值不是按减量排序的(我不确定你认为引用的哪一部分是相关的——减量不是
a+=1
的操作数之一)。也许一个新的问题将是合适的,而不是comments@M.M我指的是引文的第二部分“任务是按顺序安排的[…]如我们所知,对于postfix
--
(5.2.6p1),“--表达式的值计算在修改操作对象之前排序。“,对我来说,
++a
的副作用应该先于
--
的副作用。我在这方面已经不太活跃了,所以如果你不相信,请你提出一个新问题,当然,如果我错了,我很乐意修改我的答案。”因为它支持引用语义这只是因为C没有将运算符定义为产生左值。@bames53这是一种达到目的的手段…
++ a = 3; /* makes sense in C++ but not in C. */
a.operator++().operator--(0);