其他分享
首页 > 其他分享> > c表达式与c表达式之间的差异

c表达式与c表达式之间的差异

作者:互联网

int main()
{
   int i=3;
   (++i)++;        
   printf("%d",i);
}

这个程序适用于g编译器,但不适用于gcc.
如果我写我或我它也无法在cpp中工作.
我认为c-expression和c -exression之间存在差异.
有人可以解释L值和R值吗?

解决方法:

编辑:此答案对于更新的问题不正确,它适用于最初声明的问题.

(i)不应该使用gcc或g,无论它们是否在两种语言中将文件解析为C或C,后缀增量都需要左值作为操作数,结果是rvalue.

(注意,rvalue仅在C中正式使用.在C中,表达式的结果要么是明确的左值,要么它们不是左值.术语rvalue根本不用于C标准的规范性文本中.)

简单地说,左值是指一个对象的表达式,即概念上某个地方的存储区域.可修改的左值是指定给它的有效值,因此可以出现在赋值表达式的左侧.

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

g给出了错误:左值作为递增操作数.

前缀增量(和减量)略有不同.在C中,前缀增量的结果显式为左值(5.3.2 / 1 [expr.pre.incr]);在C中它明确地不是左值(6.5.3.1表示E等于(E = 1); 6.5.16表示任何赋值的结果不是左值).

因此,(i)仅在C语义上是正确的,但它具有未定义的行为,因为您将一个值存储到一个对象两次而没有插入序列点.

标签:c-3,c,operator-precedence
来源: https://codeday.me/bug/20191008/1874046.html