【问题标题】:Why is the output of `j= ++i + ++i;` different in C# and C?为什么`j= ++i + ++i;`的输出在C#和C中不同?
【发布时间】:2014-09-04 07:06:27
【问题描述】:
int i=1,j;
j= ++i + ++i;
printf("%d",j);

这个程序的输出是 C 中的6。但是当我对 C# 使用相同的逻辑时, 输出为 5

我想知道为什么相同的逻辑在两种不同的语言中表现不同的原因

【问题讨论】:

  • 未定义的行为意味着:5 是 6。所以输出是相同的 :)(如果在 C 中没有 sequence point,您不能更改 i 两次)跨度>
  • 您的意思是 your C 编译器中的输出为 6。其他答案是可用的,因为它是未定义的行为。
  • 可能是因为它们不是“相同的逻辑”。
  • 这两种方式都没有关系。只有白痴才会在实际代码中使用这种结构。
  • 只是好奇..在询问之前您是否对此进行过任何研究?

标签: c# c pre-increment


【解决方案1】:

C# 中的规则是“从左到右严格评估每个子表达式”。因此

j= ++i + ++i ;  

在 C# 中定义良好,但相同的表达式在 C 中调用 undefined behavior,因为您不能在两个 sequence points 之间多次修改变量。

C-FAQ

标准规定

在前一个和下一个序列点之间,对象的存储值最多只能通过表达式的评估修改一次。此外,只能访问先验值以确定要存储的值。)

阅读Eric Lippert的这篇文章以获得进一步的解释:Precedence vs Associativity vs Order

【讨论】:

  • 递增//递减运算符不计算从右到左吗?
  • 你的意思是表达吗?
  • 不保证在 C 中表达式的求值顺序。
猜你喜欢
  • 1970-01-01
  • 2020-03-28
  • 2014-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-14
  • 2011-09-22
  • 2018-09-06
相关资源
最近更新 更多