问题标签 [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 投票
4 回答
2257 浏览

c# - C# 需要 private 关键字吗?

(受此评论启发)

是否有需要使用private关键字的情况?
(换句话说,省略关键字会导致不同行为的情况)

0 投票
2 回答
3387 浏览

c++ - 为什么静态方法会覆盖基类非静态方法?

成员方法和static成员方法完全不同,原因有两个:

  1. static方法不会覆盖 base 中的虚函数class
  2. 两种情况的函数指针签名不同

当对象调用方法时,成员方法在逻辑上不应该具有更高的优先级吗?(只是 C++ 允许static使用对象调用方法,它会被视为重写方法吗?)

0 投票
5 回答
666 浏览

c++ - 什么标准条款要求这种左值到右值的转换?

鉴于:

有人可以告诉我标准的哪个条款(首选 2003 年)要求在对象初始化时将表达式x从左转换为右值y

(或者,如果我弄错了并且没有发生这种转换,那么我也想学习!)

0 投票
2 回答
447 浏览

c++ - 为什么在同一个“自动”声明中不会自动推导出基类?

以下与 , 相关的错误auto是可以理解的:

但是,为什么以下是同样的错误的受害者:

知道了,b1已经推导出来了,编译器也const B&不能试一下吗?(即如果推导出来会造成什么样的危害?)b2const B&b2const B&

0 投票
1 回答
2339 浏览

c - printf("% .0d",0) 应该打印一个空格吗?printf("%+.0d",0) 打印一个加号?

glibcprintf("% .0d",0)打印一个空格,并printf("%+.0d",0)打印一个加号,并且 glib printf 测试检查此行为。但它是正确的吗?从标准(7.19.6.1):

+ 有符号转换的结果总是以加号或减号开头。(如果未指定此标志,则仅在转换负值时才以符号开头。)

空格 如果有符号转换的第一个字符不是符号,或者如果有符号转换没有字符,则在结果前添加一个空格。如果同时出现空格和 + 标志,则忽略空格标志。

但是,关于说明d符的精度:

以零精度转换零值的结果是没有字符

自然,这个“无字符”规则并不排除将字段填充到请求的宽度,但据我所知,前缀空格或是+转换的一部分,因此受“无字符”规则的约束。

这件事有没有被澄清过?

0 投票
7 回答
39451 浏览

c++ - && 和 & 与 bool(s) 之间有什么区别吗?

在 C++ 中,在 bool(s)之间做&&(逻辑) 和(按位)有什么区别吗?&

是否相同case1case2或者如果不是,它们究竟有何不同,为什么要选择一个而不是另一个?按位和布尔值可移植吗?

0 投票
3 回答
410 浏览

c++ - 为什么单一虚拟继承不足以解决可怕的钻石问题?

在上面编码之后,编译器仍然D2要求virtual

我不明白的是,一旦您提示了与(via ) 相关的编译B器,那么为什么它仍然是模棱两可的?virtualDDD1i

(如果我没记错的话,较旧的 VC++(2006 年)足以通过单virtual继承来解决这个问题)

0 投票
4 回答
267 浏览

c - strtol 等人的规范中的混淆语言

规范在strtol概念上将输入字符串分为“初始空白”、“主题序列”和“最终字符串”,并将“主题序列”定义为:

输入字符串的最长初始子序列,从第一个具有预期形式的非空白字符开始。如果输入字符串为空或完全由空白字符组成,或者如果第一个非空白字符不是符号或允许的字母或数字,则主题序列不应包含字符。

有一次我认为“最长的初始子序列”业务类似于工作方式scanf,其中"0x@"将扫描为"0x",一个失败的匹配,然后"@"是下一个未读字符。但是,经过一些讨论,我主要相信strtol处理的是预期形式的最长初始子序列,而不是最长的初始字符串,它是预期形式的某些可能字符串的初始子序列。

仍然让我感到困惑的是规范中的这种语言:

如果主题序列为空或没有预期的形式,则不进行转换;str 的值存储在 endptr 指向的对象中,前提是 endptr 不是空指针。

如果我们接受似乎是“主题序列”的正确定义,则不存在没有预期形式的非空主题序列之类的东西,相反(为了避免冗余和混淆)文本应该只是阅读:

如果主题序列为空,则不进行转换;str 的值存储在 endptr 指向的对象中,前提是 endptr 不是空指针。

谁能为我澄清这些问题?也许指向过去讨论或任何相关缺陷报告的链接会很有用。

0 投票
3 回答
15954 浏览

c++ - 陷阱表示

  1. 什么是 C 中的“陷阱表示”(一些示例可能会有所帮助)?这适用于 C++ 吗?

  2. 鉴于此代码...

    ...并假设sizeof(int) == sizeof(float),是否具有相同的二进制表示/模式?f*pi

0 投票
2 回答
71481 浏览

c++ - 在 c++0x 中删除 nullptr 是否仍然安全?

c++03很明显,删除空指针没有任何效果。事实上,它明确指出§5.3.5/2

在任一替代方案中,如果 delete 的操作数的值是空指针,则该操作无效。

然而,在目前的草案c++0x中似乎缺少了这句话。在草案的其余部分,我只能找到说明如果删除表达式的操作数不是空指针常量会发生什么的句子。是否删除仍定义在 中的空指针c++0x,如果是,在哪里?

笔记:

有重要的间接证据表明它仍然是明确定义的。

首先,有两句话§5.3.5/2说明

在第一种选择(删除对象)中,删除操作数的值可能是空指针值,...

在第二种选择(删除数组)中,删除操作数的值可能是空指针值或...

这些说允许操作数为空,但它们本身并没有真正定义如果它是会发生什么。

其次,改变 的含义delete 0是一个重大的重大改变,标准委员会不太可能做出这种特殊的改变。c++0x此外,草案的兼容性附件(附件 C)中没有提到这是一个重大变化。然而,附录 C 是一个信息性部分,因此这与标准的解释无关。

另一方面,要求删除空指针无效的事实意味着额外的运行时检查。在很多代码中,操作数永远不能为空,因此这种运行时检查与零开销原则相冲突。也许委员会只是决定改变行为以使标准 c++ 更符合语言的既定设计目标。