编写这样的代码是否安全?
#includeint main() { int x = x-x;// always 0 int y = (y)? y/y : --y/y // always 1 }
我知道有不确定的行为,但在这种情况下它不是垃圾值吗?如果是,那么相同的值减去相同的值总是0,并且相同的值除以它自己(不包括0)总是1.如果不想使用整数文字,这是一个很大的问题,不是吗?(佯攻敌人)
请允许我展示未定义行为的邪恶魔法:
给定:
#includeint 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]
).
您不能依赖正常的算术规则来"抵消"未定义的行为.
你的节目可以回到过去,破坏权力的游戏/The Force Awakens/Supergirl.请不要这样做!