C++对数组下标有什么期望?

 天空的鸟儿飞 发布于 2023-02-12 20:11

在C中,阵列订阅:a[b]仅仅是还原糖等效指针运算之后解除引用的句法:*(a+b)(如所解释的,比方说,在这里).

对于基类型,如何在C++中解释数组订阅?(不适用于我们有超载语义的类)?而且,更具体地说,C++期望作为下标出现什么类型?是一个ptrdiff_t吗?

1 个回答
  • 如何在C++中解释数组订阅,

    C++中 E1[E2]相同*((E1)+(E2))

    C++期望以什么类型出现作为下标?

    C++期望一个无范围的枚举或整数类型这两个项目都包含在草案C++标准部分5.2.1 订阅1段中,该段落(强调我的):

    后缀表达式后跟方括号中的表达式是后缀表达式.其中一个表达式应具有"指向T的指针"类型,另一个表达式应具有未映射的枚举或整数类型.结果是类型"T"的左值.类型"T"应该是完全定义的对象类型.62表达E1 [E2]是相同的(根据定义)为*((E1)+(E2)).[注:参见5.3和5.7的细节*和+和8.3.4阵列的细节. - 尾注]

    正如詹姆斯指出的那样,其中一个表达式的措辞允许指针下标互换,例如:

    #include <iostream>
    
    int main()
    {
        int arr[5] = {1, 2, 3, 4, 5 } ;
    
        std::cout << arr[2] << ":" << 2[arr] << std::endl ;
    }
    

    2[arr]不推荐使用替代语法,大多数人不知道这是做什么的,这使得代码的可读性降低,因此维护性较差.

    这类似于C99标准 6.5.2.1 数组下标2段草案中的相关部分,其中说明(强调我的):

    后缀表达式后跟方括号[]中的表达式是数组对象元素的下标名称.下标运算符[]的定义是E1 [E2]与(*((E1)+(E2)))相同.由于适用于binary +运算符的转换规则,如果E1是数组对象(等效地,指向数组对象的初始元素的指针)并且E2是整数,则E1 [E2]指定E2的第E2个元素. E1(从零开始计数).

    2023-02-12 20:17 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有