问题标签 [unspecified-behavior]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
5 回答
1430 浏览

c - 使用指定的初始化程序初始化数组时出现奇怪的值

当我在下面初始化数组时,所有输出看起来都很好,除了values[3]. 由于某种原因values[3]初始化为values[0]+values[5]输出一个非常大的数字。我的猜测是,我试图values[0]+values[5]在它们正确存储在内存中之前进行分配,但如果有人能解释一下那就太好了。

输出如下:

0 投票
2 回答
863 浏览

c++ - 序列点歧义,未定义的行为?

今天我遇到了一些在 clang++ (3.7-git)、g++ (4.9.2) 和 Visual Studio 2013 上表现出不同行为的代码。经过一些简化后,我想出了这个突出问题的片段:

g++ (4.9.2) 给出了这个输出:

因此,g++ 将参数评估为缓冲区,然后是 buffer(..) 本身,然后将索引参数评估为数组运算符。直觉上,这对我来说很有意义。

clang (3.7-git) 和 Visual Studio 2013 都给出:

我想clang和VS2013会在它下降到缓冲区(..)之前评估所有可能的事情。这对我来说不太直观。

我想我的问题的要点是这是否是未定义行为的明显案例。

编辑:感谢您清除此问题,未指明的行为是我应该使用的术语。

0 投票
1 回答
2643 浏览

c++ - C++ 中的指针比较是未定义的还是未指定的行为?

Stroustrup 的 C++ Programming Language 3rd edition 说,

仅当两个指针都指向同一数组的元素时才定义指针的减法(尽管该语言没有快速的方法来确保这种情况)。当从另一个指针中减去一个指针时,结果是两个指针之间的数组元素数(整数)。可以将整数添加到指针或从指针中减去整数;在这两种情况下,结果都是一个指针值。 如果该值不指向与原始指针相同的数组元素或其他元素,则使用该值的结果是未定义的。

例如:

我正在阅读维基百科上未指明的行为。它说

在 C 和 C++ 中,仅当指针指向同一对象的成员或同一数组的元素时,才严格定义指向对象的指针的比较。

例子:

所以,我很困惑。哪一个是正确的?维基百科或 Stroustrup 的书?C++ 标准对此有何规定?

纠正我如果我误解了什么。

0 投票
1 回答
304 浏览

angularjs - Angular 指令的默认控制器

controllerAs如果未指定 Angular 指令定义的默认值是什么?

0 投票
2 回答
1680 浏览

c++ - 命名空间范围变量的 C++ 初始化

考虑以下程序:(请参阅此处的现场演示。

我期望程序的输出为 3.0,但它给了我输出 0。为什么?

看起来变量 d2 是静态初始化的?

不应该动态初始化吗?

我已经在 g++ 4.8.1、4.9.2 和 MSVS 2010 上对其进行了测试,并得到 0 作为输出。

0 投票
2 回答
351 浏览

c++ - 给定代码中有未定义的行为吗?

如果 p 的值在调用前被初始化为 5,那么 f(p,p) 的返回值是多少?请注意,第一个参数是通过引用传递的,而第二个参数是通过值传递的。

选项是:

  1. 3024
  2. 6561
  3. 55440
  4. 161051

我试图解释:


在这段代码中,将有四个递归调用,参数为 (6,4)、(7,3)、(8,2) 和 (9,1)。最后一次调用返回 1。但是由于通过引用传递,之前所有函数中的 x 现在都是 9。因此, f(p,p) 返回的值将是 9 * 9 * 9 * 9 * 1 = 6561。


这个问题来自竞争性考试 GATE,(参见 Q.no.-42)。答案键由 GATE “Marks to all”给出(意味着没有正确的选项。)key set-C, Q.no.-42。某处解释为:

在 GATE 2013 中,所有人都获得了标记,因为 C/C++ 中的相同代码会产生未定义的行为。这是因为*不是 C/C++ 中的序列点。正确的代码必须替换


但是给定的代码工作正常。GATE的钥匙错了吗?或者真的是问题的错误?

0 投票
4 回答
306 浏览

c++ - 不指定函数参数的准确求值顺序如何帮助 C & C++ 编译器生成优化代码?

上述程序的输出取决于编译器。未指定评估函数参数的顺序。我读到这个的原因是它可以产生高度优化的代码。不指定函数参数的准确求值顺序如何帮助编译器生成优化代码

AFAIK,评估顺序在 Java、C#、D 等语言中严格指定。

0 投票
2 回答
126 浏览

c - 评估顺序:未定义的行为?还是编译器缺陷?

我从 C 编译器得到以下测试代码的错误 asm 代码。这是由于未定义的行为吗?

什么标准说:

6.5.16 赋值运算符

操作数的求值顺序未指定。如果尝试修改赋值运算符的结果或在下一个序列点之后访问它,则行为未定义

C 运算符优先级规则

  1. ()
  2. ==
  3. || &&

对于问题案例: if ( (a) || (b && c || d) == 1 ) 编译器按以下顺序计算表达式并生成错误代码

1.(b && c || d) -->R1

2.R1 == 1 --> R2

3.(a) || R2

但是编译器会为以下情况生成正确的代码

案例1:。当没有关系 '==' 操作时

案例2:当为逻辑或运算添加括号时

案例3:操作之间没有使用括号

想知道问题案例是否属于未定义的行为类别。

问候,

苹果电脑

0 投票
2 回答
388 浏览

c++ - 取消引用 NULL 指针是否被视为未指定或未定义的行为?

stackoverflow 问题的共识说这是未定义的行为。

然而,我最近看到了 Charles Bay 在 2016 年的一次演讲,题目是:
指令重新排序无处不在:C++ 的“假设”规则和序列的作用。

37:53 ,他显示以下内容:

C++ 术语

未定义的行为:缺乏约束
(全局初始化的顺序)

未指定行为:违反约束
(取消引用 NULL 指针)

现在我有相互矛盾的信息。
这是一个错字吗?有什么改变吗?

0 投票
2 回答
1946 浏览

c++ - 是否定义了ofstream实现的默认模式?

给定以下代码:

调用.write(....)并使用stdc++libc++时,流处于二进制模式 ( std::ios::binary)。

但是,当使用MSVC (2015/2017RC1)时,它似乎处于文本模式或奇怪的状态,因为生成的文件比实际写入的文件大。

但是,如果我明确设置模式std::ios::binaryMSVC 的行为类似于std::ofstream前面提到的其他标准库的实现。


示例代码:

使用 msvc 运行时上述代码的输出:

上述代码使用 libc++、stdc++ 运行时的输出:

差异可能会更大,这取决于写入的数据量和数据的内容。

最后我的问题还是一样,是未定义的还是未指定的行为?


将上述向量更改为以下向量会使示例更明显地了解正在发生的事情。