变量初始化与自身

时间:2016-01-02 15:48:26

标签: c++ variables initialization undefined-behavior

编写此类代码是否安全?

ima

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

4 个答案:

答案 0 :(得分:8)

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

下式给出:

#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

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

答案 1 :(得分:7)

  

我知道有未定义的行为,但在这种情况下它不是垃圾值吗?如果是,则相同的值减去相同的值始终为0,并且相同的值除以其自身(不包括0)始终为1.

没有!不,不,不!

“垃圾值”是“不确定的价值”。

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

您不能依赖正常的算术规则来“抵消”未定义的行为。

Your program could travel back in time并破坏权力的游戏 / The Force Awakens / Supergirl 适合所有人。请不要这样做!

答案 2 :(得分:1)

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

答案 3 :(得分:1)

未定义的行为是未定义的行为。在这种情况下,没有&#34;它不是特定的&#34; (除非你实际上在谈论完成编译的结果,并查看生成的机器代码,但这不再是C ++)。编译器可以随意做任何事情。