正如标题所说,
一个典型的答案是:
允许任何和所有代码转换不会改变程序的可观察行为的规则
我们会不时地从某些实现中获取行为,这些行为归因于此规则.好多次错了.那么,这个规则究竟是什么呢.标准没有明确地将此规则作为一个部分或段落提及,那么究竟什么属于这条规则的范围?对我来说,这似乎是一个灰色区域,标准没有详细定义.有人可以根据标准的参考资料详细说明细节.
注意:将其标记为C和C++,因为它与两种语言都相关.
int i = i;
int main() {
int a = a;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
int a = a肯定有未定义的行为 (UB),关于它的更多细节在
读取未初始化的值总是未定义的行为吗?或者有例外吗?.
但是呢int i = i?在 C++ 中,我们可以为全局变量分配非常量值。i在遇到声明之前声明并零初始化(因为它具有文件范围)。在这种情况下,我们将0在定义的后面分配给它。可以说这没有 UB 吗?
我刚刚在一个函数中找到了这行代码,这让我很困惑.这在任何情况下都有意义,还是未定义的行为?
char * acFilename = acFilename;
Run Code Online (Sandbox Code Playgroud)
编辑:编译器抱怨警告C4700,我正在使用未初始化的变量.
我偶然发现了令我惊讶的行为:
写作时:
int x = x+1;
Run Code Online (Sandbox Code Playgroud)
在C/C++程序中(或者涉及新创建的变量x的更复杂的表达式),我的gcc/g ++编译没有错误.在上述情况下,X之后为1.请注意,前一个声明的范围中没有变量x.
所以我想知道这是否是正确的行为(甚至可能在某些情况下有用)或者只是我的gcc版本或gcc的解析器pecularity.
顺便说一句:以下不起作用:
int x++;
Run Code Online (Sandbox Code Playgroud) 受到这个问题的启发。
我们知道具有非constexpr初始化器的全局变量会经历两种不同的“初始化”:
哪些初始化启动了变量生命周期?[basic.life]令人惊讶的是无益的:
对象的生命周期......开始于:......它的初始化(如果有)完成
我看到几个选项:
(1) 最有意义,但它会使稍后动态初始化的对象的静态初始化几乎无用。
(2)会产生有趣的效果。例如,静态初始化命令失败突然不再是 UB(本身)了。
(3) 会很奇怪。