问题标签 [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.
c++ - 如何在 C++ 中指定 unsigned char 类型的整数文字?
我可以指定一个 unsigned long 类型的整数文字,如下所示:
我该如何处理 unsigned char?
这是避免编译器警告所必需的:
我希望避免我目前拥有的冗长的解决方法,并且没有在调用 min 的行中出现“unsigned char”而不在单独的行上的变量中声明 9:
c++ - “读取” POD 预增量结果不会产生未定义的行为。为什么?
这是一个愚蠢的问题。:)
[编辑:愚蠢与否,这原来是一个 C++ 特殊问题,请参阅 UPDATE_2]
假设我们有:
第 2 行发生的情况是(注意,数字只是标记,没有指定确切的顺序):
(4)中的“写”在(3)中的“读”之前“排序”,并且由于之间没有序列点,因此不能保证副作用发生在(3)之前(还有一个“ read" 在 (4) 本身内部,但在 "write"之前排序,因此不会产生 UB)。
那么,上面的错误在哪里?
[更新,针对没有经验的序列点律师:)]
换句话说,问题是:
无论是左值到右值的转换(“读取”)还是增量(“写入”)的副作用首先发生,似乎都存在“竞争”。
在 C 中,根据JTC1/SC22/WG14 N926“序列点分析” *,这将给出一个 UB(例如,参见示例 5 :) 。
int x,y; (x=y) + x; // UB
请注意,如果使用后增量,则不会出现这种情况,因为 (3) 和 (4) 将构成单个[(3): 取“a”左值,将其转换为右值并返回该右值] “写”副作用延迟到下一个序列点之前的某个地方
_
(*) 这看起来像是 C99 标准委员会成员给出的主题的最清晰的系统原理。
[更新_2]
经验教训:永远不要用 C 规则来判断 C++ :))。我确实想知道为什么 N926(它清楚地描述了 C99 的方式)在产生 l 值的前增量的主题上“不够清楚”。
问题出现了,如何为 C++ 建立类似的基本原理,因为没有,因为即使在 C 案例中,仅解释标准也非常困难,而 C++ 语言标准要复杂得多且晦涩难懂。
[更新_3]
在“通用表达式的不确定性”中有一个处理一些相关主题的讨论(至少在较新的一半) 。,此外,委员会人员在这里讨论了此事(请参阅“222. 序列点和左值返回运算符”)。
python - 为什么我不能将 self 作为命名参数传递给 Python 中的实例方法?
这有效:
这有效:
即使这样也有效:
但是为什么这在 Python 2.x 中不起作用呢?
这使得元编程更加困难,因为它需要特殊情况处理。我很好奇Python的语义是否有必要或只是实现的工件。
c++ - 何时在空实例上调用成员函数会导致未定义的行为?
考虑以下代码:
我们预计(b)
会崩溃,因为空指针没有对应x
的成员。在实践中,(a)
不会因为this
指针从未使用过而崩溃。
因为(b)
取消引用this
指针 ( (*this).x = 5;
) 并且this
为 null,所以程序进入未定义的行为,因为取消引用 null 总是被认为是未定义的行为。
会(a)
导致未定义的行为吗?如果两个函数(和x
)都是静态的呢?
c++ - C++ 标准中的哪些措辞允许 static_cast(malloc(N)); 去工作?
据我了解 5.2.9 静态转换中的措辞,唯一一次void*
允许对象指针转换void*
的结果是首先是逆转换的结果。
在整个标准中,有一堆对指针表示的引用,指针的表示与void
指针的表示相同char
,依此类推,但似乎从未明确地说强制转换任意void
指针会产生指针到内存中的同一位置,具有不同的类型,很像类型双关是未定义的,其中不双关回到对象的实际类型。
因此,虽然malloc
清楚地返回了合适内存的地址等,但据我所见,似乎没有任何方法可以实际使用它,可移植。
c - 在结构中引用未定义类型如何合法?
作为回答另一个问题的一部分,我遇到了这样的一段代码,gcc 编译时没有抱怨。
这是我一直用来构造指向自身的类型(例如,链表)的方法,但我一直认为您必须为结构命名,以便可以使用自引用。换句话说,您不能xyz *z
在结构中使用,因为此时 typedef 尚未完成。
但是这个特定的示例没有命名结构,它仍然可以编译。我最初认为编译器中有一些黑魔法会自动翻译上述代码,因为结构和 typedef 名称是相同的。
但这个小美女也很有效:
我在这里想念什么?这似乎是一个明显的违规行为,因为在任何地方都没有struct NOTHING_LIKE_xyz
定义类型。
当我将它从指针更改为实际类型时,我得到了预期的错误:
此外,当我删除 时struct
,我得到一个错误(parse error before "NOTHING ...
)。
这在 ISO C 中是否允许?
更新: Astruct NOSUCHTYPE *variable;
也可以编译,因此它不仅仅是在它似乎有效的结构内部。我在 c99 标准中找不到任何允许对结构指针宽大的东西。
c++ - 将括号初始化列表分配给数组是否正确?
标准说,在 5.17/9 下
一个花括号初始化列表可能出现在- 对标量的赋值 [...]
- 由用户定义的赋值运算符 [..] 定义的赋值的右侧
在 GCC 4.5.1-pre9999 中,我可以编译它(使用 -std=c++0x,NOT -std=gnu++0x)
它打印出来123456
。GCC在这里正确吗?
fortran - Fortran:整数 * 4 与整数(4)与整数(种类 = 4)
我正在尝试学习 Fortran,我看到很多不同的定义被传递,我想知道他们是否正在尝试完成同样的事情。以下有什么区别?
integer*4
integer(4)
integer(kind=4)
c++ - typedef 和非简单类型说明符
为什么此代码无效?
而下面的代码是有效的
?
根据我的理解unsigned int
,不是一个"simple type specifier"
,所以代码格式不正确。不过我不确定。
谁能指出Standard
使第一个代码无效(而第二个代码有效)的相关部分?
编辑
尽管Johannes Schaub 的回答似乎是正确的,而且中肯(顺便说一句,他已经删除了他的回答),但我接受了 James Curran 的回答,因为它的正确性和准确性。
c++ - 如何将枚举导入 C++ 中的不同命名空间?
我在命名空间中有一个枚举,我想像在不同的命名空间中一样使用它。直觉上,我认为我可以使用“使用”或“类型定义”来完成此操作,但实际上都不起作用。证明它的代码片段,在 GCC 和 Sun CC 上测试:
问题是枚举本身是导入的,但没有任何元素。不幸的是,在不破坏大量其他现有代码的情况下,我无法将原始枚举更改为包含在额外的虚拟命名空间或类中。我能想到的最佳解决方案是手动重现枚举:
但它违反了DRY 原则。有没有更好的办法?