gpt4 book ai didi

c++ - 鉴于 b 始终非零,为什么 `b ? --b :++b` 有效,但 `--b` 无效?

转载 作者:IT老高 更新时间:2023-10-28 22:20:30 29 4
gpt4 key购买 nike

我试图使用递归将两个整数相乘,并意外编写了这段代码:

//the original version
int multiply(int a, int b)
{
if ( !b )
return 0;
else
return a + multiply(a, b ? --b : ++b ); //accident
}

我说,我不小心写了这个,因为我打算写:

b > 0 ? --b :++b 而不是 b ? --b :++b

我意识到我打算写的 wouldn't work .但令我惊讶的是,我所做的不是打算写does work .

现在,我注意到 b ?--b :++b 基本上等同于 --b 因为 b 在 else- block 保证非零。于是我修改了上面的代码,把b?--b:++b换成--b,如下图:

//the modified version
int multiply(int a, int b)
{
if ( !b )
return 0;
else
return a + multiply(a, --b); //modification here
}

由于原始版本可以正常工作,我希望修改后的版本也能正常工作。但是,令我惊讶的是,它 doesn't work!

  • 修改后的版本有什么问题?
  • 不等同于原版吗?
  • --b 是否不等于 b ?--b :++b IF b 非零?如果它是等价的,那么为什么第一个代码有效而第二个代码无效?

注意:这里的“工作”是指它给出了正确的输出。也就是说,它给出了传递给函数的整数的乘法

最佳答案

它不起作用。我不知道ideone在冒什么烟,那代码会溢出堆栈。

编辑

在 gcc 4.6.0 上尝试过 - 段错误(由于堆栈溢出)。但是,如果您启用 -O2 优化,那么确实“它有效”。总而言之:它的工作是偶然的,取决于编译器在幕后做了什么。

g++ -g -Wall -o f f.cpp # stack overflow
g++ -O2 -g -Wall -o f f.cpp # "works"

关于c++ - 鉴于 b 始终非零,为什么 `b ? --b :++b` 有效,但 `--b` 无效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6386601/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com