相关疑难解决方法(0)

究竟什么是"假设"规则?

正如标题所说,

究竟什么是"假设"规则?

一个典型的答案是:

允许任何和所有代码转换不会改变程序的可观察行为的规则

我们会不时地从某些实现中获取行为,这些行为归因于此规则.好多次错了.那么,这个规则究竟是什么呢.标准没有明确地将此规则作为一个部分或段落提及,那么究竟什么属于这条规则的范围?对我来说,这似乎是一个灰色区域,标准没有详细定义.有人可以根据标准的参考资料详细说明细节.

注意:将其标记为C和C++,因为它与两种语言都相关.

c c++ optimization c++-faq as-if

83
推荐指数
2
解决办法
7359
查看次数

在 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 吗?

c++ undefined-behavior language-lawyer

64
推荐指数
2
解决办法
4029
查看次数

这种自我指派是否做了明智的事情?

我刚刚在一个函数中找到了这行代码,这让我很困惑.这在任何情况下都有意义,还是未定义的行为?

char * acFilename = acFilename;
Run Code Online (Sandbox Code Playgroud)

编辑:编译器抱怨警告C4700,我正在使用未初始化的变量.

c c++

20
推荐指数
3
解决办法
4070
查看次数

在初始化中使用新声明的变量(int x = x + 1)?

我偶然发现了令我惊讶的行为:

写作时:

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)

c c++ initialization undefined-behavior

9
推荐指数
3
解决办法
3060
查看次数

如果一个全局变量被初始化两次(静态,然后是动态),哪个初始化开始它的生命周期?

受到这个问题的启发。

我们知道具有非constexpr初始化器的全局变量会经历两种不同的“初始化”:

  • 首先是“静态初始化”,它对它们进行零初始化。
  • 其次,“动态初始化”,它使用用户提供的初始化程序。

哪些初始化启动了变量生命周期?[basic.life]令人惊讶的是无益的:

对象的生命周期......开始于:......它的初始化(如果有)完成

我看到几个选项:

  1. 最后一次初始化开始生命周期。
  2. 第一次初始化开始生命周期。
  3. 每次连续初始化都会破坏现有对象并在其位置创建一个新对象。

(1) 最有意义,但它会使稍后动态初始化的对象的静态初始化几乎无用。

(2)会产生有趣的效果。例如,静态初始化命令失败突然不再是 UB(本身)了。

(3) 会很奇怪。

c++ language-lawyer

5
推荐指数
1
解决办法
190
查看次数