2017-02-04 51 views
0

在学习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],这仍然是陌生的我。

我可以问这个历史吗?为什么如此以及如何帮助实现这一目标?

+0

@πάνταῥεῖ我想这个问题不应该被认为是连接问题的重复,因为它是关于C++而不是C. – Brian

+0

@布赖恩随意投票重新开放。 –

+0

没有必要从它的外观。看起来像有人使用了伪装铁砧。 – user4581301

回答

12

在C中,a[i]被定义为表示*(a + i)。根据这个定义,你可以看到a[i]i[a]的意思是一样的。

C++继承自C这个“功能”,但是,请注意,在C++:

  • i[a]a[i]只意味着同样的事情,如果他们不叫重载运算符;例如,如果a的类型为std::vector<int>,则您发布的代码将不起作用。
  • 在C++ 14及更高版本中,a[i]*(a + i)并不相同,因为前者并不总是左值。
+0

在C++ 14及以上版本的情况下,[i]不是左值?只是好奇。 –

+2

@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)。 –

相关问题