k 没有初值
by 233L @ 2023-08-07 23:14:24
@[Genuine](/user/934698) O2 优化对变量自动赋初始值,你的 `k` 要自己写初始值
by cn_ryh @ 2023-08-07 23:17:35
> O2 优化对变量自动赋初始值
没这回事。读没初始化的值像数组访问越界一样是未定义行为。
by ud2_ @ 2023-08-08 00:46:12
@[ud2_](/user/206953) 事实上内存地址没有清空的情况下是可以读的,只是有安全问题吧
by cn_ryh @ 2023-08-08 07:29:45
@[ud2_](/user/206953) 我不知道是不是我版本的问题,但是他的代码在我本地**无 O2** 情况下会发生 `RE`。原因是 $k$ 的初始值为负数,**开启 O2**情况下能正常运行,结果正确,$k$ 自动初始化为 $0$。
by cn_ryh @ 2023-08-08 07:43:44
@[cn_ryh](/user/458193) 按你认为的“自动初始化为 0”的规律,这段代码在 `-O2` 下应该输出 `0`:
```cpp
#include <iostream>
static int fn(bool x) {
int a;
if (x) a = 42;
return a;
}
int main() {
std::cout << fn(false) << '\n';
return 0;
}
```
另外,[这个例子值得一提](https://devblogs.microsoft.com/oldnewthing/20040119-00/?p=41003)。
by ud2_ @ 2023-08-08 08:02:48
@[ud2_](/user/206953) 编译选项 `std=c++14 -static -O2` (与国赛相同)本地是输出 `0` 的.
在我之前参与的项目中确实是禁止使用未初始化变量避免安全问题的,不过后来发现在某些奇怪的架构下非全局变量会被按照全局变量初始化
![](https://cdn.luogu.com.cn/upload/image_hosting/3aptce5i.png)
by cn_ryh @ 2023-08-08 08:08:36
@[ud2_](/user/206953) 感觉很奇怪,在我另外的一个环境上跑是 `42`
by cn_ryh @ 2023-08-08 08:14:34
@[cn_ryh](/user/458193) 在输出 `0` 的机器上,`g++ -v -fsyntax-only -x c++ /dev/null` 输出什么?我试试能不能用相同环境复现。
by ud2_ @ 2023-08-08 08:25:49
@[ud2_](/user/206953) 报错
```sh
g++: error: unrecognized command line option ‘-fsyntax-only’
g++: error: compilation failed
```
by cn_ryh @ 2023-08-08 08:29:59