【发布时间】:2019-12-21 06:47:23
【问题描述】:
今天我偶然发现了一个 C 谜语,给我带来了新的惊喜。
我认为下面示例中的 -1[p] 不会编译,但它确实可以编译。事实上,x 最终是 -3。
int x;
int array[] = {1, 2, 3};
int *p = &array[1];
x = -1[p]
我在互联网上搜索了类似 -1[pointer] 的东西,但找不到任何东西。好吧,我承认很难输入正确的搜索查询。谁知道为什么 -1[p] 编译后 X 变成 -3?
【问题讨论】:
-
同
-(p[1])同-(array[2])。 -
这个谜语有两个层次:要理解它,首先你必须知道
a[5] == 5[a]。但是,如果您还没有记住 C 的不太直观的优先规则,或者如果您不记得 C 将-1视为一元减号运算符的应用程序(而不是将其视为单个标记和本质上负常数),您可能会误以为-1[p]与p[-1]相同,而不是-(p[1])。 -
当然它的绑定比索引低,否则看起来理智的
-p[1]会试图否定一个指针...... -
@EugeneSh。我也正要投票给
a[5] == 5[a]一个作为骗子,但它实际上只涵盖了这个问题的一半。我想说这里令人惊讶的优先级同样重要。 -
@SteveSummit 我不确定为什么优先级如此令人惊讶并且值得一整个 5 个答案的问题。是的,这可能有点令人困惑,但这是一个非常基本的事情,尤其是考虑到代码执行的结果..
标签: c arrays pointers unary-operator postfix-operator