Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.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和x27之间的差异;s表达式与c++';s表情_C++_C_Operator Precedence - Fatal编程技术网

C++ c和x27之间的差异;s表达式与c++';s表情

C++ c和x27之间的差异;s表达式与c++';s表情,c++,c,operator-precedence,C++,C,Operator Precedence,该程序可以使用g++编译器,但不能使用gcc。 如果我写i+++或++i++,它在cpp中也不起作用。 我认为c表达式和c++表达式之间有区别。 有人能解释一下L值和R值吗?编辑:这个答案对于更新的问题是不正确的,它适用于最初陈述的问题。 (i++)++< /COD>不适用于GCC或G++,无论它们是否在两种语言中解析为C或C++,后缀增量都需要LV值作为操作数,结果为rValue/ (注意,在C++中只使用正式的值。在C中,表达式的结果是显式的LValk,或者它们不是LVales。 简单地说

该程序可以使用g++编译器,但不能使用gcc。 如果我写i+++或++i++,它在cpp中也不起作用。 我认为c表达式和c++表达式之间有区别。
有人能解释一下L值和R值吗?

编辑:这个答案对于更新的问题是不正确的,它适用于最初陈述的问题。

<代码>(i++)++< /COD>不适用于GCC或G++,无论它们是否在两种语言中解析为C或C++,后缀增量都需要LV值作为操作数,结果为rValue/ <>(注意,在C++中只使用正式的值。在C中,表达式的结果是显式的LValk,或者它们不是LVales。 简单地说,左值是指对象的表达式,即概念上的某个存储区域。可修改的左值是可以有效赋值的对象,因此可以显示在赋值表达式的左侧

右值只是一个值,可以从中指定可修改的左值,但不能指定给它。它只能出现在赋值表达式的右侧

g++
给出错误:
作为增量操作数所需的左值

前缀增量(和减量)略有不同。在C++中,前缀增量的结果是一个LValuy(5.3.2/1[ExPR.PR..CCR]);在C语言中,它显然不是左值(6.5.3.1声明++E等价于(E+=1);6.5.16声明任何赋值的结果都不是左值)

因此,C++中的代码> >(++i)++< /COD>仅在C++中是语义正确的,但是它有未定义的行为,因为您在没有中间序列点的情况下将对象存储到两次。 有些语言使用左值的概念 和右值。左值是 以编程方式创建地址 可访问正在运行的程序 (例如,通过–操作员的某个地址) 就像C++中的“&”),意思是 是变量还是取消引用 对某个内存的引用 地点。右值可以是左值(请参见 或非左值-仅限术语 用于区分左值。在里面 C、 左值一词最初的意思是 可以分配给某人的东西 (来自左值,表示 它在房子的左边 赋值运算符),但自 “const”被添加到语言中, 这现在被称为“可修改” 左值'

5.2.6美元-

通过应用后缀++获得的值是操作数在应用运算符之前的值。[注:获得的值是原始值的副本]操作数应为可修改的左值。操作数的类型应为算术类型或指向完整对象类型的指针。记录结果后,通过向对象中添加1来修改对象的值,除非对象的类型为bool,在这种情况下 这是真的。[注意:此用法已被弃用,请参见附录D。]结果为右值。结果类型为操作数类型的cv非限定版本。另见5.7和5.17

$5.3.2/1-

前缀++的操作数通过添加1进行修改,如果是bool,则将其设置为true(不推荐使用此用法)。操作数应为可修改的左值。


Charles Bailey解释:C++表达式返回r值和C++表达式返回L值。@贾根:为什么你认为你应该猜?这不是真的;在C和C++中,后缀增量表达式的结果是一个rValue.@ Charles Bailey:“PrimeApple表达式”是什么?@贾根:前缀增量的结果是C++中的LValk,但是你的问题(或者直到你的编辑)没有提到前缀增量运算符。C++中的用户定义类型右值可以出现在作业的左侧,例如
std::string(“hello”)=std::string(“world”)
。我不小心按下了回滚按钮!像这样愚蠢的表达式是无效的(人类也无法解析),因此试图弄清楚为什么一种语言接受它们而另一种语言不接受它们是无效的。它们没有意义,因为外部操作需要修改左值。如果++的结果是一个左值,那么您可能还有一个序列点问题,该问题会产生未定义的行为。@Jagan:请不要在问题回答后更改代码示例(尤其是在您接受了答案的情况下)。这使得被接受的答案不正确。@Jagan:根据语言的语义,它是无效的,因此是愚蠢的。这种硬读的任何内容都不会在实际代码中使用。您团队的其他成员会来告诉您不要再愚蠢了,请修复代码。在实际代码中,您永远不会(永远)看到这些语法上看似愚蠢的结构。任何难读的东西都很难维护。拥有一种灵活的高级语言的全部目的是使代码易于维护,因此不要故意试图滥用这种信任。
int main()
{
   int i=3;
   (++i)++;        
   printf("%d",i);
}