变量本身初始化

Variable initialization with itself

本文关键字:初始化 变量      更新时间:2023-10-16

编写这样的代码安全吗?

#include <iostream>
int main()
{
    int x = x-x;// always 0
    int y = (y)? y/y : --y/y // always 1
}

我知道存在未定义的行为,但在这种情况下,这不只是一个垃圾值吗?若是,那个么相同的值减去相同的总是0,并且相同的值除以它自己(不包括0)总是1。如果一个人不想使用整数文字,那就太好了,不是吗?(佯攻敌人)

请允许我展示未定义行为的邪恶魔力:

给定:

#include <iostream>
int main()
{
    using namespace std;
    int x = x-x;// always 0
    int y = (y)? y/y : --y/y; // always 1
    cout << x << ", " << y << endl;
    return 0;
}

apple clang,用-O3:编译

输出:

1439098744, 0

未定义是未定义。上面代码中的注释是谎言,这将混淆随机数生成器的未来维护者;-)

我知道存在未定义的行为,但在这种情况下,这不只是一个垃圾值吗?若是,那个么相同的值减去相同的总是0,并且相同的值除以它自己(不包括0)总是1。

不!不,不,不!

"垃圾值"是一个"不确定值"。

从自身减去一个不确定的值不会产生零:它会导致程序具有未定义的行为[C++14: 8.5/12])。

你不能依靠正常的算术规则来"抵消"未定义的行为。

你的程序可能会穿越到过去,破坏所有人的《权力的游戏》。请不要这样做!

未定义的行为是未定义的。总是在某些平台上,东西可能或多或少可靠地工作或中断,但总的来说,你不能依赖这个程序不崩溃或任何具有特定值的变量。

未定义的行为是未定义的。不存在"在这种情况下,它不是特定的吗"(除非您实际上谈论的是完成编译的结果,并查看生成的机器代码,但这不再是C++)。编译器可以随心所欲。