- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我越来越难跟上不断发展的 C++ 标准,但现在对我来说很清楚的一件事是数组索引值应该是整数(不是 long long
或 size_t
或其他一些看起来更适合 size 的选择)。我从这个问题的答案 (Type of array index in C++) 以及成熟的 C++ 库(如 Qt)使用的实践中推测了这一点,这些库也使用简单的整数来表示大小和数组索引运算符。对我来说,棺材上的钉子是我现在从 MSVC 2017 收到大量编译器警告,指出我的 const unsigned long long
(又名 const size_t
) 变量在用作数组索引时被隐式转换为 const int
类型。
Mat 在上面链接的问题中给出的答案引用了 ISO C++ 标准草案 n3290如说
it shall be an integral constant expression and its value shall be greater than zero.
我没有阅读这些规范和准确解释他们语言的背景,所以可能需要澄清几点:
long long
之类的东西,对我来说它是一个整数类型,只是一个更大的类型?unsigned
的类型,例如 size_t
?如果我在这里看到的一切都是真的,数组索引值应该是 signed int
类型,为什么?这对我来说似乎违反直觉。规范甚至声明表达式“应大于零”,所以如果它是签名
,我们就有点浪费了。当然,我们仍然可能希望以某种方式将索引与 0
进行比较,这对于 unsigned
类型来说是危险的,但是应该有更便宜的方法来解决这个只会浪费的问题单个值,而不是整个位。
此外,随着寄存器的不断扩大,一个更具前瞻性的解决方案是允许更大的索引类型(如 long long
),而不是坚持使用 int
无论如何在历史上都是一个有问题的类型(当处理器更改为 32 位
时更改其大小,然后当它们变为 64 位
时则不会)。我什至看到一些人在传闻中谈论 size_t
,就像它被设计成一种更适合 future 使用的类型(而不仅仅是 sizeof
服务中返回的类型) > 运营商)。但当然,这可能是杜撰的。
我只是想确保我对这里的基础编程理解没有缺陷。当我看到像 ISO C++ 组这样的专家或 Qt 的工程师在做某事时,我相信他们有充分的理由!对于像数组索引这样的编程基础,我觉得我需要知道原因是什么,否则我可能会遗漏一些重要的东西。
最佳答案
查看[expr.sub]/1我们有
A postfix expression followed by an expression in square brackets is a postfix expression. One of the expressions shall be a glvalue of type “array of T” or a prvalue of type “pointer to T” and the other shall be a prvalue of unscoped enumeration or integral type. The result is of type “T”. The type “T” shall be a completely-defined object type.67 The expression E1[E2] is identical (by definition) to *((E1)+(E2)), except that in the case of an array operand, the result is an lvalue if that operand is an lvalue and an xvalue otherwise. The expression E1 is sequenced before the expression E2.
强调我的
因此,下标运算符的索引需要是无作用域的枚举或整数类型。在找[basic.fundamental]我们看到标准整数类型是 signed char
、short int
、int
、long int
和 long long int
,以及它们的无符号拷贝。
因此,任何标准整数类型都可以工作,任何其他整数类型(如 size_t
)都将是用作数组索引的有效类型。提供给下标运算符的值甚至可以是负值,只要该值可以访问有效元素即可。
关于c++ - 为什么 C++ 数组索引值是有符号的而不是围绕 size_t 类型构建的(或者我错了)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51562875/
给定一个字符串,例如 s="##$$$#",我如何找到索引之前的“#”符号数等于“”数的索引$"符号在索引之后? 示例:如果 s="##$$$#",则输出将为 2。 解释:在索引 2 之前我们有 2
在本教程中,您将借助示例了解 JavaScript 符号。 JavaScript 符号 JavaScript ES6 引入了一种新的原始数据类型,称为 Symbol(符号)。符号是不可变的(不能更改)
在“函数编程的工艺”一书中,符号 '>.>' 将函数连接在一起,与 '.' 的方向相反。但是当我使用 ghci 实现它时,它显示了超出范围的错误 '>.>'。为什么?它是不再使用的旧符号吗? 最佳答案
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我需要从向量中删除 \"。这是我的数据: data <- c("\"https://click.linksynergy.com/link?id=RUxZriH*PWc&offerid=323058.1
我在 Nginx 配置中使用正则表达式来捕获文件 URL,但如果文件 URL 包含 # 符号,正则表达式模式将不会捕获它。 这里是nginx的配置部分。 location ~ ^/p/(?[\w\-=
如何使 & 符号在此图表的第一组条形/列下正确显示: http://jsfiddle.net/VxbrK/2/ 应该是“Apples & Oranges”而不是“Apples & Oranges”。
**在verilog中是什么意思? 我为测试台提供了以下逻辑 localparam NUM_INPUT_BITS = 1; localparam NUM_OUTPUT_BITS
我有一个使用正则表达式来验证电子邮件地址的方法。 public String searchFormail(String searchWord) { Pattern pattern = Patt
我想将一个字符串拆分为数字部分和文本/符号部分我当前的代码不包含负数或小数,并且表现得很奇怪,在输出的末尾添加了一个空列表元素 import re mystring = 'AD%5(6ag 0.33-
我有一些代码需要从数组中选择一个随机字符串,但它一直返回单个字母或数字。如何解决这个问题? var name = ["Yayek", "Vozarut", "Gezex",
我刚开始使用 Python,我在考虑应该使用哪种表示法。我读过 PEP 8关于 Python 符号的指南,我同意那里的大多数内容,除了函数名称(我更喜欢混合大小写风格)。 在 C++ 中,我使用匈牙利
在用 C# 编写代码时,我错误地在 if 语句中的变量前添加了一个符号(而不是感叹号)。 bool b = false; if (@b) { } 我很惊讶它编译成功,没有任何错误。 我想知道:上面的代
本文实例为大家分享了特殊字符替换电话号码中某一部分的方法,ios利用-号替换电话号码中间四位,供大家参考,具体内容如下 1、效果图 2、代码 rootviewcontroll
当我使用“x”和“z”作为符号时,这段代码没有问题: from sympy import * x, z = symbols('x z') y = -6*x**2 + 2*x*z**0.5 + 50*x
我需要从文本中删除标点符号: data <- "Type the command AT&W enter. in order to save the new protocol on modem;"
我有几个数字是 numeric 类。下面的例子。 df = c(12974,12412,124124,124124,34543,4576547,32235) 现在我想在每个数字前添加 '$' 符号而不
我有一个 highcharts 图例,其中符号以不同的大小显示,因为它们在实际图表中的大小不同。不幸的是,当数据点的大小增加时,它们也会在图例中增加。无论数据点大小如何,我都希望图例符号保持相同的大小
我需要使用包含平均值+-SD的标题。到目前为止,我只能得到以下信息: "Mean +- SD or N (%)" [1] "Mean +- SD or N (%)" 如何直接使用“+-”符号?您知道一
使用 XSLT 和 XPath 1.0,我有一个要转义的字符串以用于 URL,例如: one word & another 因此,描述元素的 text() 应该进行 URL 转义。 我该怎么做
我是一名优秀的程序员,十分优秀!