问题标签 [language-lawyer]

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 投票
9 回答
47194 浏览

c++ - 如何在 C++ 中指定 unsigned char 类型的整数文字?

我可以指定一个 unsigned long 类型的整数文字,如下所示:

我该如何处理 unsigned char?

这是避免编译器警告所必需的:

我希望避免我目前拥有的冗长的解决方法,并且没有在调用 min 的行中出现“unsigned char”而不在单独的行上的变量中声明 9:

0 投票
2 回答
355 浏览

c++ - “读取” POD 预增量结果不会产生未定义的行为。为什么?

这是一个愚蠢的问题。:)

[编辑:愚蠢与否,这原来是一个 C++ 特殊问题,请参阅 UPDATE_2]

假设我们有:

第 2 行发生的情况是(注意,数字只是标记,没有指定确切的顺序):

(4)中的“写”在(3)中的“读”之前“排序”,并且由于之间没有序列点,因此不能保证副作用发生在(3)之前(还有一个“ read" 在 (4) 本身内部,但在 "write"之前排序,因此不会产生 UB)。

那么,上面的错误在哪里?

[更新,针对没有经验的序列点律师:)]

换句话说,问题是:

  1. 无论是左值到右值的转换(“读取”)还是增量(“写入”)的副作用首先发生,似乎都存在“竞争”。

  2. 在 C 中,根据JTC1/SC22/WG14 N926“序列点分析” *,这将给出一个 UB(例如,参见示例 5 :) 。int x,y; (x=y) + x; // UB

  3. 请注意,如果使用后增量,则不会出现这种情况,因为 (3) 和 (4) 将构成单个[(3): 取“a”左值,将其转换为右值并返回该右值] “写”副作用延迟到下一个序列点之前的某个地方

_

(*) 这看起来像是 C99 标准委员会成员给出的主题的最清晰的系统原理。

[更新_2]

  1. 经验教训:永远不要用 C 规则来判断 C++ :))。我确实想知道为什么 N926(它清楚地描述了 C99 的方式)在产生 l 值的前增量的主题上“不够清楚”。

  2. 问题出现了,如何为 C++ 建立类似的基本原理,因为没有,因为即使在 C 案例中,仅解释标准也非常困难,而 C++ 语言标准要复杂得多且晦涩难懂。

[更新_3]

在“通用表达式的不确定性”中有一个处理一些相关主题的讨论(至少在较新的一半) 。,此外,委员会人员在这里讨论了此事(请参阅“222. 序列点和左值返回运算符”)。

0 投票
1 回答
3120 浏览

python - 为什么我不能将 self 作为命名参数传递给 Python 中的实例方法?

这有效:

这有效:

即使这样也有效:

但是为什么这在 Python 2.x 中不起作用呢?

这使得元编程更加困难,因为它需要特殊情况处理。我很好奇Python的语义是否有必要或只是实现的工件。

0 投票
2 回答
16141 浏览

c++ - 何时在空实例上调用成员函数会导致未定义的行为?

考虑以下代码:

我们预计(b)会崩溃,因为空指针没有对应x的成员。在实践中,(a)不会因为this指针从未使用过而崩溃。

因为(b)取消引用this指针 ( (*this).x = 5;) 并且this为 null,所以程序进入未定义的行为,因为取消引用 null 总是被认为是未定义的行为。

(a)导致未定义的行为吗?如果两个函数(和x)都是静态的呢?

0 投票
3 回答
1559 浏览

c++ - C++ 标准中的哪些措辞允许 static_cast(malloc(N)); 去工作?

据我了解 5.2.9 静态转换中的措辞,唯一一次void*允许对象指针转换void*的结果是首先是逆转换的结果。

在整个标准中,有一堆对指针表示的引用,指针的表示与void指针的表示相同char,依此类推,但似乎从未明确地说强制转换任意void指针会产生指针到内存中的同一位置,具有不同的类型,很像类型双关是未定义的,其中不双关回到对象的实际类型。

因此,虽然malloc清楚地返回了合适内存的地址等,但据我所见,似乎没有任何方法可以实际使用它,可移植。

0 投票
7 回答
2587 浏览

c - 在结构中引用未定义类型如何合法?

作为回答另一个问题的一部分,我遇到了这样的一段代码,gcc 编译时没有抱怨。

这是我一直用来构造指向自身的类型(例如,链表)的方法,但我一直认为您必须为结构命名,以便可以使用自引用。换句话说,您不能xyz *z在结构中使用,因为此时 typedef 尚未完成。

但是这个特定的示例没有命名结构,它仍然可以编译。我最初认为编译器中有一些黑魔法会自动翻译上述代码,因为结构和 typedef 名称是相同的。

但这个小美女也很有效:

我在这里想念什么?这似乎是一个明显的违规行为,因为在任何地方都没有struct NOTHING_LIKE_xyz定义类型。

当我将它从指针更改为实际类型时,我得到了预期的错误:

此外,当我删除 时struct,我得到一个错误(parse error before "NOTHING ...)。

这在 ISO C 中是否允许?


更新: Astruct NOSUCHTYPE *variable;也可以编译,因此它不仅仅是在它似乎有效的结构内部。我在 c99 标准中找不到任何允许对结构指针宽大的东西。

0 投票
1 回答
529 浏览

c++ - 将括号初始化列表分配给数组是否正确?

标准说,在 5.17/9 下


一个花括号初始化列表可能出现在- 对标量的赋值 [...]
- 由用户定义的赋值运算符 [..] 定义的赋值的右侧

在 GCC 4.5.1-pre9999 中,我可以编译它(使用 -std=c++0x,NOT -std=gnu++0x)

它打印出来123456。GCC在这里正确吗?

0 投票
3 回答
32766 浏览

fortran - Fortran:整数 * 4 与整数(4)与整数(种类 = 4)

我正在尝试学习 Fortran,我看到很多不同的定义被传递,我想知道他们是否正在尝试完成同样的事情。以下有什么区别?

  • integer*4
  • integer(4)
  • integer(kind=4)
0 投票
3 回答
559 浏览

c++ - typedef 和非简单类型说明符

为什么此代码无效?

而下面的代码是有效的

?

根据我的理解unsigned int,不是一个"simple type specifier",所以代码格式不正确。不过我不确定。

谁能指出Standard使第一个代码无效(而第二个代码有效)的相关部分?

编辑

尽管Johannes Schaub 的回答似乎是正确的,而且中肯(顺便说一句,他已经删除了他的回答),但我接受了 James Curran 的回答,因为它的正确性和准确性。

0 投票
5 回答
13954 浏览

c++ - 如何将枚举导入 C++ 中的不同命名空间?

我在命名空间中有一个枚举,我想像在不同的命名空间中一样使用它。直觉上,我认为我可以使用“使用”或“类型定义”来完成此操作,但实际上都不起作用。证明它的代码片段,在 GCC 和 Sun CC 上测试:

问题是枚举本身是导入的,但没有任何元素。不幸的是,在不破坏大量其他现有代码的情况下,我无法将原始枚举更改为包含在额外的虚拟命名空间或类中。我能想到的最佳解决方案是手动重现枚举:

但它违反了DRY 原则。有没有更好的办法?