学校里的信息学会考题目

学术版

@[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


上一页 |