在学习18 Essential C++ Interview Questions,我发现了以下(怪)声明一个问题:为什么(1 + 3)[a]与[1 + 3]相同?
std::cout << (1 + 3)[a] - a[0] + (a + 1)[2];
当时的答案解释,(1+3)[a] is the same as a[1+3]
,这仍然是陌生的我。
我可以问这个历史吗?为什么如此以及如何帮助实现这一目标?
在学习18 Essential C++ Interview Questions,我发现了以下(怪)声明一个问题:为什么(1 + 3)[a]与[1 + 3]相同?
std::cout << (1 + 3)[a] - a[0] + (a + 1)[2];
当时的答案解释,(1+3)[a] is the same as a[1+3]
,这仍然是陌生的我。
我可以问这个历史吗?为什么如此以及如何帮助实现这一目标?
在C中,a[i]
被定义为表示*(a + i)
。根据这个定义,你可以看到a[i]
和i[a]
的意思是一样的。
C++继承自C这个“功能”,但是,请注意,在C++:
i[a]
和a[i]
只意味着同样的事情,如果他们不叫重载运算符;例如,如果a
的类型为std::vector<int>
,则您发布的代码将不起作用。a[i]
与*(a + i)
并不相同,因为前者并不总是左值。在C++ 14及以上版本的情况下,[i]不是左值?只是好奇。 –
@AlexTelon a [i]是[_xvalue_](http://en.cppreference.com/w/cpp/language/value_category#xvalue),如果a是数组_rvalue_。另请参见[built-in_subscript_operator](http://en.cppreference.com/w/cpp/language/operator_member_access#Built-in_subscript_operator)。 –
@πάνταῥεῖ我想这个问题不应该被认为是连接问题的重复,因为它是关于C++而不是C. – Brian
@布赖恩随意投票重新开放。 –
没有必要从它的外观。看起来像有人使用了伪装铁砧。 – user4581301