订阅字符串文字

时间:2014-05-11 12:03:23

标签: c++

订阅字母数字是一种常见/有效的技巧吗?什么是隐含的转换? example

#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;
}

3 个答案:

答案 0 :(得分:8)

索引文字字符串并不常见,但它有其用途,例如

auto hex_digit( int const value )
    -> char
{
    assert( 0 < value && value < 0x10 );
    return "0123456789ABCDEF"[value];
}

答案 1 :(得分:3)

当然,编写

并没有什么意义

cout&lt;&lt; &#34;你好&#34; [0]&lt;&lt; ENDL;

而非简单

cout&lt;&lt; &#39; H&#39; &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))相同(根据定义)

然而,第二条记录只会让读者感到困惑。

至于转换然后是字符串文字的左值&#34;你好&#34;类型为const char[6]的类型转换为const char *类型。然后使用指针算法计算表达式*((E1)+(E2))。

答案 2 :(得分:0)

它当然有效。涉及很少的类型转换。

考虑语言元素"Hello"实际上意味着

  const char * anonymousVariable = "Hello";

然后anonymousVariable[1]产生值为'e'的char,而anonymousVariable[1123]会产生不可预测的内容。

以这种方式编写代码是个好主意吗?它可能会也可能不会,取决于您尝试使用的模式。