【问题标题】:How does C++ process this [duplicate]C ++如何处理这个[重复]
【发布时间】:2015-03-11 03:42:46
【问题描述】:

我这里有一个等式,我无法理解 c++ 是如何处理它的。谁能解释一下这个操作?

代码:

#include <stdio.h>

    main(){
        int a[10] = {0,1,2,3,4,5,6,7,8,9};
        int i = 0;
        int num = a[i+++a[++i]]+a[++i+i++];
        printf("\nnum1: %d i: %d,num,i);
    }

为什么答案是 num = 9 而索引 i 刚好等于 4;

【问题讨论】:

  • 哦,我的,你这里有maximal munchundefined behavior 的问题。这里也没有 C++。
  • 放弃那行蹩脚的代码,转而使用人类可以阅读和理解的东西,而无需花费一个小时来了解运算符优先级、序列点和未定义行为如何在评估该行时发挥作用。
  • @ShafikYaghmour 我同意你的其他观点,但为什么它不是 C++,它是无效的,C 和 C++?
  • 它是有效的 C++。 printf 是有效的 C++。它在风格上不是很好的 C++,而且它使用的 C++ 方法几乎被所有人所反对,但 printf 是 C++ 标准的一部分,因此说它“不是 C++”是完全错误的。
  • @StevenBurnap Implicit int 然而,从来都不是 C++。

标签: c++ c


【解决方案1】:

在同一变量的同一表达式中使用++ 两次在C 和C++ 标准的所有版本中都明确未定义,因此i 不一定等于4。它可以是编译器编写者随心所欲的任何事情。

永远不要这样做。切勿在同一个表达式中使用两次++--。没有办法对结果值做出任何声明,并且没有任何经验对一个编译器所做的事情对另一个编译器所做的事情有任何意义。

【讨论】:

  • 我需要知道发生了什么。如果未定义,为什么c ++会成功编译并执行此代码。它是由我们的培训师提供给我们的,用于追踪这段代码中发生的事情。那么到底发生了什么?
  • C 和 C++ 都成功编译了很多未定义的东西。 “未定义”并不意味着“不会编译”。这意味着“如果你这样做会发生什么是未定义的”。如果有人声称要教 C 或 C++ 给你这个值得尝试评估的东西,那么我会严重怀疑他们作为老师的素质。
  • (我不能告诉你真正会发生什么,因为这完全取决于你使用的编译器,编译器作者肯定没有记录。)
  • 好的,谢谢。现在很清楚了。
猜你喜欢
  • 2013-05-16
  • 2018-01-23
  • 2021-11-06
  • 2020-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多