C++ 变量自身初始化

C++ 变量自身初始化,c++,variables,initialization,undefined-behavior,C++,Variables,Initialization,Undefined Behavior,写这样的代码安全吗 #include <iostream> int main() { int x = x-x;// always 0 int y = (y)? y/y : --y/y // always 1 } #包括 int main() { int x=x-x;//始终为0 int y=(y)?y/y:--y/y//始终为1 } 我知道存在未定义的行为,但在这种情况下,它不只是一个垃圾值吗?如果是,则相同值减去相同值始终为0,相同值除以自身(不包括0)始终为

写这样的代码安全吗

#include <iostream>

int main()
{
    int x = x-x;// always 0
    int y = (y)? y/y : --y/y // always 1
}
#包括
int main()
{
int x=x-x;//始终为0
int y=(y)?y/y:--y/y//始终为1
}

我知道存在未定义的行为,但在这种情况下,它不只是一个垃圾值吗?如果是,则相同值减去相同值始终为0,相同值除以自身(不包括0)始终为1。如果你不想使用整型文字,那就太好了,不是吗?(假装敌人)

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

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

未定义的行为就是未定义的行为。这里没有“在这种情况下,它不是某种特定的东西吗”(除非您实际上谈论的是完成编译的结果,并查看生成的机器代码,但这不再是C++)。编译器可以随心所欲地执行任何操作。

未定义的行为就是未定义的行为。这里没有“在这种情况下,它不是某种特定的东西吗”(除非您实际上谈论的是完成编译的结果,并查看生成的机器代码,但这不再是C++)。编译器可以做任何它想做的事情

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

不!不,不,不

“垃圾值”是一个“不确定值”

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

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

《权力的游戏》/《原力觉醒》/《每个人的超女》。请不要这样做

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

不!不,不,不

“垃圾值”是一个“不确定值”

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

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


《权力的游戏》/《原力觉醒》/《每个人的超女》。请不要这样做

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

鉴于:

#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;
}

未定义是未定义的。上面代码中的注释是谎言,会让随机数生成器的未来维护人员感到困惑;-)

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

鉴于:

#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;
}

未定义是未定义的。上面代码中的注释是谎言,会让随机数生成器的未来维护人员感到困惑;-)

如果您非常讨厌字符文字,以至于您会继续编写暴露未定义行为的代码(甚至在同一语句中多次),那么为什么不直接使用命名常量呢?您如何得出这样的结论:您正在从自身减去相同的值?此外,假设单位化值必须是稳定的,
y
最初为零。为什么要在读取
/
操作符的RHS之前要求
--y/y
递减?如果你真的想阻止敌人,一个更有效的方法是为了你自己的利益尽可能让代码可读,但是雇佣一队律师阻止你的敌人使用代码。如果你如此讨厌字符文字,如果您继续编写暴露未定义行为(甚至在同一语句中多次)的代码,那么为什么不直接使用命名常量呢?您如何得出从自身减去相同值的结论?此外,假设单位化值必须是稳定的,
y
最初为零。为什么要在读取
/
操作员的RHS之前要求
--y/y
递减?如果你真的想阻止敌人,一个更有效的方法是为了你自己的利益,尽可能使代码可读,但雇佣一队律师阻止你的敌人使用代码。@BlackMoses(产生最快和最短的代码)解释是,编译器注意到Expression调用未定义的行为,所以它只是删除了整个初始化,没有为它生成任何机器代码。然后是内存(甚至寄存器)持有变量值只是碰巧拥有这些值。@BlackMoses此技巧奏效,因为当行为在标准中被指定为未定义时,编译器可以做任何它想做的事情。允许的代码序列集是所有代码序列的无限集。通常,如果它正在优化,编译器宁愿不这样做hing,因为这和做某事一样正确。@BlackMoses,事实上,在检查上述程序的汇编程序输出时,我看到了对
operator@BlackMoses:相反,编译器是忠实的朋友!在这种情况下,程序员才是编译器的私生子。@BlackMoses如果编译器是私生子,他们会引诱代码尝试和窥探下一个网上银行会话,然后转移一些资金为他们自己的利益……这完全是由C++标准允许的(可能不被当地法律允许)。解释是,编译器注意到Expression调用未定义的行为,所以它只是删除了整个初始化,并没有为它生成任何机器代码,然后是内存