@[WorldBest丶牛顿](/space/show?uid=53164)
不懂VB语义,但你“翻译”的这个问题比较有意思。
作为C++向前进展保证的一部分,无可观察side-effect的无限循环为undefined behavior。编译器可选移除(而且GNU都是这么做的)
当循环被移除时,估计您的输出是对未初始化局部变量的。所以才会产生这种奇怪的值(也称垃圾值),这也是一个undefined behavior。
by constructor @ 2018-06-20 17:49:14
@[TimeTraveller](/space/show?uid=62235) 所以看起来Vb也具有向前进展保证。
by constructor @ 2018-06-20 17:49:53
@[constructor](/space/show?uid=56461) 尝试了一下,
我在全局定义了循环变量为1,最后还是输出的值还是为2^31-1。
```cpp
#include<bits/stdc++.h>
using namespace std;
short i=1;
int main()
{
short s=0;
for(i;i<=5;i-=2)
{
s+=i;
}
cout<<s<<" "<<i;
return 0;
}
```
输出了1 32676(这个和我刚才说的2^31-1性质一样)
但是如果我在全局定义一个flag,判断循环变量是否经过-3的时候,它真的表示经过了。
```cpp
#include<bits/stdc++.h>
using namespace std;
short i=1,ans;
int main()
{
short s=0;
for(i;i<=5;i-=2)
{
s+=i;
if(i==-3) ans=100;
}
cout<<s<<" "<<i<<" "<<ans;
return 0;
}
```
输出了100
所以我又尝试了一下,
```cpp
#include<bits/stdc++.h>
using namespace std;
short i=-32767;
int main()
{
i-=2;
cout<<i;
return 0;
}
```
这段代码输出了32767,这就说明在变量比最小值小于1时反而会变成最大值,这就能解释我之前的代码为什么会输出2^31-1
PS:手机输入法敲代码好累啊。
by WorldBest丶牛顿 @ 2018-06-21 00:19:22
@[WorldBest丶牛顿](/space/show?uid=53164)
这只能说明在GCC下这不算死循环(要么是真的不当做是要么就是它没看出来)
因为有符号整数算术溢出也是UB。但是当做下溢出时从`std::numeric_limits<int>::max()`开始了。所有的这些都是实现在搞事,所以具体做出什么反应都是未知的。。。
by constructor @ 2018-06-21 08:44:40