C++ 为什么答案总是等于5?

C++ 为什么答案总是等于5?,c++,math,C++,Math,给出此代码: #include <iostream> #include <cmath> using namespace std; int main() { int k, x; while(k > x-3) { k--; // cout << "x = " << x << "\n"; } x++, k--; int aux = abs(k-x);

给出此代码:

#include <iostream>
#include <cmath>
using namespace std;

int main() {
    int k, x;

    while(k > x-3) {
         k--;
         // cout << "x = " << x << "\n";
    }
    x++, k--;

    int aux = abs(k-x);
    cout << aux;
}
当我们运行它时,它总是弹出一个常数x=50,整数k和x之间的绝对值总是5。你能给我解释一下这是为什么以及如何工作的吗?

在k大于x的约束下,这段代码在这里

while(k > x-3) {
     k--;
     // cout << "x = " << x << "\n";
}
将k减小到比x小3

下一行,x++,k++;将它们都增加1,但不会改变结果。k仍然比x小3


k-x是-3,absk-x是3,因此程序总是打印3。当然,假设k和x都已初始化,并且k大于x。程序在未初始化k和x的情况下发布时表现出未定义的行为,因此无法保证会发生什么。同样,正如Aconcagua指出的,如果x小于INT_MIN+3,也会导致未定义的行为。

Matthieu和πάνταῥεῖ 正确:这是典型的未定义行为。使其未定义而不是简单地未指定或实现定义的一个基本原理是,某些体系结构具有未初始化寄存器的标志,并且可能会陷阱。编译器实际上可以自由地将其编译成一个空程序:读取未初始化的变量可以产生任何结果,而任何结果都不是任何结果的子集。未定义行为之后的所有后续代码都会受到前面错误的影响,可以忽略。请注意,不同的体系结构和不同的编译器,甚至可能是使用同一编译器的不同C标准库!可能会产生不同的结果;即使是与优化或函数调用约定有关的不同编译器标志也可能会改变这种未定义的行为

这个答案的其余部分适用于这个问题的版本,其中循环后面的行读作x++,k++;而不是现在的k

但是你遇到了一个一致的行为,问题是为什么它是一致的。第一个假设是编译器不只是生成输出5的代码,它可以合法地生成与C语句相对应的机器代码。我们将根据这些陈述进行推理

然后,该行为表明x和k所在的内存位置包含的值使k>x-3立即为假。否则,k将递减,直到差值为3,而不是5

如果条件为假,则变量差不会改变;由此我们可以得出结论,x-k==5,从一开始就是5。如果省略abs,则输出应为-5


变量具有这些一致初始值的原因可能与操作系统或C运行时环境在程序启动时所做的事情有关,比如初始化标准流。尝试使用printf而不是cout,看看结果是否有变化。

我真的认为您应该尝试两个任意数字。 例如,假设我们使用k=10&x=8。 您的循环将如下所示: 当10>5 10-1=9时。。。依此类推,直到K不大于X-3。 你会得到k=5,x是相同的值,8。 在while循环之后,减小k,增加x,因此k=4,x=9。 Absk-x=5

如果你想要更多的理论解释,循环将允许你的两个变量之间的差值为3,X将大于K。
在循环之后,你减少K和增加X,它们之间的差值总是5。

实际上是未定义的行为,因为K和X没有初始化。那么这个程序的解释是什么呢?你使用的是未初始化的K和X,所以这是未定义的行为。除了假设它们被初始化为默认值之外,你没有接受任何输入或随机值,那么为什么每次都会期望不同的结果呢?@AlexCiornei那么这个程序的解释是什么?对于未定义行为的行为没有合理的解释,对于一个非常特定版本的非常特定的编译器来说是最好的。所以这是一个不适定的问题,因为代码原样是UB,但他们希望设置k和x。你错过了UB的另一个可能性:下溢,因为x小于INT_MIN+3…@acocagua Good catch,我把它添加到了答案中。@PeterA.Schneider-编辑历史清楚地表明OP在回答了这个问题后编辑了他们的帖子。如果有人应该受到高射,那就是他们,而不是布莱泽。@PeterA.Schneider,@Blaze-OP将k++编辑成k-。坦白地说,我不知道他们想要什么,只是他们表现出了不好的网络礼仪。@StoryTeller哦,我错过了。是的,有了k-结果当然是5。他真的应该提到编辑。答案涉及到当代码读x++,k++;时问题的一个版本;。目前,5是初始值为k>=x-3的预期结果,包括两者均为0的可能并不罕见的情况。在这种情况下,Blaze的回答是正确的。也许值得注意的是,如果我没有弄错的话,只有当k>=x-3时,才可能输出5。在将问题中的k++更改为k-之后。我的直觉是 这是一个针对这一观点的问题。