字母数字下标是一种常见/有效的技术吗?发生了哪些隐式转换?例子:
#include <iostream>
using namespace std;
int main()
{
int k(2);
cout << "Hello"[k] << endl;
cout << (k-1)["Hello"] << endl;
// your code goes here
return 0;
}
索引文字字符串并不常见,但它有它的用途,例如
auto hex_digit( int const value )
-> char
{
assert( 0 < value && value < 0x10 );
return "0123456789ABCDEF"[value];
}
当然写
没有太大意义cout & lt; & lt;"你好"[0]& lt; & lt;endl;
代替简单的
cout & lt; & lt;"H"& lt; & lt;endl;
然而,有时有些东西
#define Hello "Hello"
在一些(尤其是C)程序中。
在这种情况下,写
是有意义的cout & lt; & lt;你好[0]& lt; & lt;endl;
但是定义
会更好const char *Hello = "Hello";
或
const char Hello[] = "Hello";
"Hello"[0]
和
0["Hello"]
因为根据c++标准
表达式E1[E2]与(根据定义)*((E1)+(E2))相同
但是第二条记录只会让代码的读者感到困惑。
对于转换,将类型为const char[6]
的字符串字面值"Hello"的左值转换为类型为const char *
。然后使用指针算术计算表达式*((E1)+(E2))。
这当然是有效的。只涉及很少的类型转换。
考虑语言元素"Hello"
实际上表示
const char * anonymousVariable = "Hello";
则anonymousVariable[1]
生成值为'e'
的字符,anonymousVariable[1123]
生成不可预测的值。
这样写代码是个好主意吗?它可能是,也可能不是,这取决于你试图使用的模式。