变量本身初始化
Variable initialization with itself
编写这样的代码安全吗?
#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++)。编译器可以随心所欲。
相关文章:
- 初始值设定项列表是否只接受使用相同类型的值初始化变量?
- 在 C++ 中访问 lambda 捕获初始化变量
- 为什么C++不支持对未初始化变量进行智能分析?
- 使用 clang++ 和 g++ 在C++中初始化变量
- C++使用 lambda 初始化变量
- 如何在初始化列表中的构造函数之后初始化变量/对象?
- C++ - 输出与初始化变量不同?
- C++/Win32 构造函数不使用从对话框获取的字符串初始化变量
- 在C++中,为什么int可以使用new运算符初始化变量,而double不能
- 具有静态存储持续时间的常量初始化变量的初始化顺序
- C++ 中的初始化变量
- C++中未初始化变量的值
- 如何在需要提及需要循环声明的其他类的类中初始化变量?
- 我想知道在构造函数中初始化变量时的生命周期
- 读取恰好具有良好值的未初始化变量
- 如何在 getter 的父类中初始化变量的情况下访问子类中的变量
- 为什么在 c++ 中有多种初始化变量的方法
- 没有参数的默认构造函数是否总是初始化变量?
- 是否可以使用 lambda 初始化变量(删除复制 ctor 时)
- 使用构造函数跳闸UB的新放置后使用初始化变量