当前位置:  开发笔记 > 编程语言 > 正文

变量初始化与自身

如何解决《变量初始化与自身》经验,为你挑选了2个好方法。

编写这样的代码是否安全?

#include 

int main()
{
    int x = x-x;// always 0
    int y = (y)? y/y : --y/y // always 1
}

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



1> Richard Hodg..:

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

给定:

#include 

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

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


@BlackMoses:相反,编译器是忠实的朋友!在这种情况下,程序员是编译器的混蛋.
@BlackMoses,实际上,检查上面程序的汇编输出,我看到调用`operator <<`而没有先初始化第一个参数寄存器`ESI`.

2> Lightness Ra..:

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

没有!不不不!

"垃圾价值"是"不确定的价值".

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

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

你的节目可以回到过去,破坏权力的游戏/The Force Awakens/Supergirl.请不要这样做!

推荐阅读
贾志军
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有