在C++中使用字符串作为整数索引

5

可能是重复问题:
在C++中,为什么这个表达式成立?a[5] == 5[a]

为什么这个表达式在C++中是合法的?

void main()
{
  int x = 1["WTF?"];
}

在VC++10上,这段代码可以编译通过,在调试模式下语句执行后,x的值是84。为什么会这样?

5
这一定是几十个问题的重复... - Sergey Kalinichenko
请在这里查看。 - default
一个更好的问题是,对于一些用户定义类型重载了 operator [](int) 的情况,这个代码会起作用吗:5[myType()] - paul23
1
@paul23 内在的标量由编译器进行了快捷处理,因此不能直接访问。然而...永远不要说永远。请查看这个无用的代码片段,其中包含一个 int* 的强制转换运算符。它确实可以做到你想要的事情。愉快的时光。 - WhozCraig
1
有时候我会在索引变量中这样做,只是为了看到同行程序员的反应。你知道的,一个复杂的for循环,然后在其中嵌入:i++[arName]之类的代码。这可以让他们保持警惕 =P - WhozCraig
显示剩余2条评论
3个回答

9
数组下标运算符是可交换的。它相当于int x = "WTF?"[1];。这里,"WTF?"是一个由5个char组成的数组(包括空终止符),而[1]给出了第二个字符,即'T' - 隐式转换为int,它给出了值84。
离题:代码片段实际上不是有效的C++代码 - main必须返回int
您可以在此处阅读更深入的讨论:在C数组中为什么这是真的? a [5] == 5 [a]

3
+1代表支持“main函数必须返回整数(int)”这个观点 :) - default
好的,它是有效的微软C++,因为它可以编译 :) - ehremo
我很惊讶它没有抓取后面的字母并给出0x003F4654,因为你将变量x声明为int而不是char - puppydrum64

3
int x = 1["WTF?"];

等于

int x = "WTF?"[1];

84是“T”的ASCII码。


1
这个方法之所以有效,是因为当将内置运算符[]应用于指针和整数时,a[b]等同于*(a+b)。由于加法是可交换的,这等同于*(b+a),根据[]的定义,这又等同于b[a]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接