根据 C++ 14 标准(5.2.1 下标)
1 后缀表达式后跟方括号中的表达式是
后缀表达式。其中一个表达式应具有类型
“T 数组”或“指向 T 的指针”,另一个应为无范围的
枚举或整数类型。结果是“T”类型。 “T”型
应该是一个完全定义的对象类型。64 表达式 E1[E2] 是
与 *((E1)+(E2)) 相同(根据定义) [注:见 5.3 和 5.7
* 和 + 的详细信息以及数组的详细信息 8.3.4。 — 尾注],除了
在数组操作数的情况下,如果该操作数是,则结果是左值
一个左值和一个 xvalue,否则。
因此,stra[0] 表达式的计算结果类似于 *( stra + 0 ),与 *stra 相同。
注意,+ 是可交换的,所以*( stra + 0 ) 和*( 0 + stra ) 是一样的。这意味着你甚至可以写0[stra] 而不是stra[0]。
这是一个演示程序,它使用字符串 litarals 代替 std::string 类型的对象。
#include <iostream>
int main()
{
std::cout << "Heelo"[0] << ' ' << *"Hello" << '\n';
return 0;
}
程序输出是
H H
C++ 中的字符串文字由常量字符数组表示。例如,字符串文字"Hello" 像未命名的字符数组一样存储
const char unnamed_string_literal[] = { 'H', 'e', 'l', 'l', 'o', '\0' };
在带有解引用运算符 * 或下标运算符 [] 的表达式中使用它们将转换为指向它们的第一个 const char * 类型元素的指针。因此这种说法
std::cout << "Heelo"[0] << ' ' << *"Hello" << '\n';
输出字符串文字"Hello"的第一个字符。