【问题标题】:Why i+++ works fine but +++i gives error?为什么 i+++ 工作正常但 +++i 给出错误?
【发布时间】:2014-09-15 02:30:33
【问题描述】:

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

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

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

【问题讨论】:

  • 即使行为不是未定义的,无论i=i+++ ++i; 应该是什么意思,肯定有更清晰的方式来表达它,也许int i = 3; 如果恰好是你的意思。
  • 虽然很好理解为什么第二行会产生错误,但这是一种糟糕的编码风格。请避免这种编码风格。
  • @RSahu 我没有使用这种风格,只是想了解一些事实。

标签: c operators post-increment pre-increment


【解决方案1】:

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

i = i ++ + ++ i ;

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

而您的第二个示例被解析为:

i = i ++ ++ + i ;

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

后自增运算符的结果是一个右值,它是前一个自增变量值的副本。将另一个后自增运算符应用于右值是错误的,因为该运算符需要一个 左值,直观地说,是可以分配给的表达式,例如 i 或 *p。

此外,此代码包含未定义的行为。您正在阅读i 并在没有干预序列点的情况下对其进行修改——;、&&、||、, 或?:——这意味着程序行为是不可预测,并且会因编译器而异。

【讨论】:

  • 也称为“最大咀嚼”规则。
  • 这不仅仅是表达式的结果是不可预测的;整个程序的行为是不确定的。
  • @KeithThompson:确实如此。我的意思是“表达式的结果”,如“将会发生什么”,而不是“将产生的价值”。不确定有更好的表达方式。
  • 您可以将“表达式的结果”替换为“程序的行为”。
  • @JonPurdy 行为是如何不确定的,我总是得到 3 作为答案。
【解决方案2】:

这两个语句都会产生未定义的行为。但是,第一行正常工作的原因是因为您的编译器将其解释为(i++)+ ++i;,而第二行是i++ ++(+i),这没有任何意义。

【讨论】:

    猜你喜欢
    • 2023-03-17
    • 2011-08-24
    • 1970-01-01
    • 2021-12-14
    • 2014-04-05
    • 1970-01-01
    • 1970-01-01
    • 2012-08-25
    • 1970-01-01
    相关资源
    最近更新 更多