C 为什么我+++;工作正常,但+++;我给错了吗?

C 为什么我+++;工作正常,但+++;我给错了吗?,c,operators,post-increment,pre-increment,C,Operators,Post Increment,Pre Increment,我用C语言尝试了一些代码,但遇到了这个问题 int i=0; i=i+++ ++i; //works fine //i=i++ +++i; gives error 我的困惑是i++是如何运行的?但是+++i返回错误。C运算符根据“最长匹配”规则进行解析。您的第一个示例被解析为: i = i ++ + ++ i ; i = (i++) + (++i); i = i ++ ++ + i ; i = ((i++)++) + i; 而您的第二个示例被解析为: i = i ++ + ++

我用
C
语言尝试了一些代码,但遇到了这个问题

int i=0;
i=i+++ ++i;   //works fine
//i=i++ +++i;   gives error

我的困惑是
i++
是如何运行的?但是
+++i
返回错误。

C运算符根据“最长匹配”规则进行解析。您的第一个示例被解析为:

i = i ++ + ++ i ;

i = (i++) + (++i);
i = i ++ ++ + i ;

i = ((i++)++) + i;
而您的第二个示例被解析为:

i = i ++ + ++ i ;

i = (i++) + (++i);
i = i ++ ++ + i ;

i = ((i++)++) + i;
后增量运算符的结果是一个右值,即递增的变量的上一个值的副本。将另一个增量后运算符应用于右值是错误的,因为该运算符需要一个左值,直观地说,这是一个表达式,例如可以指定给的
i
*p


此外,此代码还包含未定义的行为。您正在读取
i
并在没有插入序列点的情况下修改它-
&&
?:
-这意味着程序行为是不可预测的,并且在不同的编译器中会有所不同。

C运算符根据“最长匹配”规则进行解析。您的第一个示例被解析为:

i = i ++ + ++ i ;

i = (i++) + (++i);
i = i ++ ++ + i ;

i = ((i++)++) + i;
而您的第二个示例被解析为:

i = i ++ + ++ i ;

i = (i++) + (++i);
i = i ++ ++ + i ;

i = ((i++)++) + i;
后增量运算符的结果是一个右值,即递增的变量的上一个值的副本。将另一个增量后运算符应用于右值是错误的,因为该运算符需要一个左值,直观地说,这是一个表达式,例如可以指定给的
i
*p


此外,此代码还包含未定义的行为。您正在读取
i
并在没有插入序列点的情况下修改它-
&&
?:
-这意味着程序行为是不可预测的,并且在不同的编译器中会有所不同。

这两种语句都会产生未定义的行为。但是,第一种方法工作正常的原因是编译器将其解释为
(i++)+++i,而第二行是
i++++(++i)
,这毫无意义。

这两个语句都产生未定义的行为。但是,第一种方法工作正常的原因是编译器将其解释为
(i++)+++i,而第二行是
i++++(++i)
,这毫无意义。

也被称为“最大芒克”规则。这不仅仅是不可预测的表达式的结果;整个程序的行为是未定义的。@KeithThompson:没错。我的意思是“表达的结果”,如“将发生什么”,而不是“将产生的价值”。不确定是否有更好的表达方式。你可以用“程序的行为”替换“表达式的结果”。@JonPurdy行为是如何定义的,我总是得到3作为答案。也被称为“最大咀嚼”规则。不只是表达式的结果是不可预测的;整个程序的行为是未定义的。@KeithThompson:没错。我的意思是“表达的结果”,如“将发生什么”,而不是“将产生的价值”。不确定是否有更好的表达方式。你可以用“程序的行为”替换“表达式的结果”。@JonPurdy行为是如何定义的,我总是得到3作为答案。即使行为没有定义,不管是什么
I=I+++I
的意思是,肯定有一种更清晰的方式来表达它,也许
inti=3如果这恰好是你的意思。虽然理解第二行产生错误的原因很好,但这是一种糟糕的编码风格。请避免使用这种编码风格。@RSahu我不是在使用这种风格,只是想了解一些事实。即使行为没有定义,不管是什么
I=I+++I
的意思是,肯定有一种更清晰的方式来表达它,也许
inti=3如果这恰好是你的意思。虽然理解第二行产生错误的原因很好,但这是一种糟糕的编码风格。请避免这种编码风格。@RSahu我不是在使用这种风格,只是想了解一些事实。