【发布时间】:2015-11-11 04:55:36
【问题描述】:
我知道这将是非常糟糕的编码风格,但以下代码在我的机器上完美运行。但是行为是否明确定义?便携吗?
int main()
{
int *p = new int[3];
int *q = &p[2];
q[-1] = 41;
std::cout << p[1];
delete[] p;
}
【问题讨论】:
-
只是记忆中的餐巾纸回答,但我相信 foo[x] 在标准中被定义为与 *(foo + x) 完全等价,其中 x 是整数类型,而 foo 是指针,所以我认为在后面的任何地方都是合法的。
-
不要在 C++ 中这样做。如果我看到
thing[-1],我会想“哦,我可以很好地阅读最后一个元素”——比如 Python,而不是“它是指之前的东西” -
@AlecTeal 这真的不是禁止这样做的好理由。如果我们禁止每一个误导性地类似于另一种流行语言的形式的表达,那么就什么都没有了。我们甚至无法编写 IF 语句,因为它们看起来很像 Fortan II 的算术 IF。
-
@SteveCox 你是对的。未来的程序员将使用它。
-
你是否重载了一个操作符?
标签: c++ operator-overloading language-lawyer