我知道无限递归或迭代是未定义的行为,但有界不是。但是,该程序段对于大多数输入都是错误的。它具有未定义的行为,为什么或为什么不呢?如果它具有未定义的行为,我是否可以进行一些修改以删除未定义的行为?

#include <cstdint>

using bigint = ::std::uint64_t;
constexpr const bigint add_val = 1442695040888963407;
constexpr const bigint mult_val = 6364136223846793005;

bigint compute(bigint t)
{
   if (t > 1) {
      return add_val + compute(t * mult_val);
   } else {
      return 1;
   }
}

int main(int argc, char const * const argv[])
{
   return compute(argc < 0 ? -argc : argc);
}

基本上,这是使用递归来遍历linear congruential random number generator with a period of 2^64的所有值,因此可以保证最终达到0或1。

我在问一个非常明确而具体的问题。任何人都可以编译并完整运行的程序是否会根据C++标准调用未定义的行为?

最佳答案

多亏了101010的标准链接,我认为相关的短语是







主要解决了编译器的局限性(最大符号长度,每行字符等),但是该语言听起来与以下内容有关:



因此,该标准并没有说明实现可能会限制哪些数量,也没有给出有关其所描述的那些限值的最小值的准则以外的任何内容。

如果您的编译器没有记录其堆栈深度限制,那么根据粗体语句,我认为它可能不符合要求,但是声明“堆栈深度受这些运行时属性限制”可能就足够了。



不能。但是根据4.1/2.1,允许实现无法编译或无法正确执行正确的程序。

关于c++ - 此具有有限递归的程序是否具有未定义的行为?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56811284/

10-14 09:23