【问题标题】:Can you tell me what is going on here [duplicate]你能告诉我这里发生了什么吗[重复]
【发布时间】:2020-04-10 12:48:55
【问题描述】:

这一行发生了什么:

-1[0[ptr]][0] 

【问题讨论】:

  • 您不能在此处发布一些随机的、完全脱离上下文的(大概)代码字符,并希望我们向您解释。如果没有其他代码赋予它任何有意义的机会,就无法解释。另外,你能告诉我这里发生了什么吗?不是任何有意义的标题或问题。如果您花一些时间在tour 和阅读help center 页面(尤其是How to Ask)以了解该网站的运作方式以及我们在您开始发布之前的期望,您会发现您在这里的体验会好得多。
  • 我会说,这会导致编译错误或 SEGENV(Segmentation fault)
  • @dan1st 不。请看下面我的回答。它是有效的 C/C++
  • @robthebloke 好的...
  • @dan1st 诚然,这不是我推荐的编码风格 :)

标签: c


【解决方案1】:

从技术上讲,这是有效的 C 代码,但不值得这样写。考虑这个愚蠢的例子。

char v = array[3];

现在,我们可以用指针算法重写它。例如

char v = *(array + 3);

但是,由于加法是可交换的,因此这也是有效的:

char v = *(3 + array);

由于加法是可交换的,因此数组括号也是可交换的。所以这在 C 中是完全有效的:

char v = 3[array];

如果你想解开你发布的代码,你可以分步进行......

float f0(float*** ptr)
{
    return -1[0[ptr]][0];
}
float f1(float*** ptr)
{
    return -1[ptr[0]][0];
}
float f2(float*** ptr)
{
    return -ptr[0][1][0];
}

这是它们相同的证据:

https://godbolt.org/z/_gSUXF

(f2 和 f3 只会导致对 f1 的尾调用)

/edit 我认为你因为提出这个问题而被如此严厉地打分有点不公平。它实际上是 C/C++ 的一个很酷的怪癖,很少有人知道。

【讨论】:

    猜你喜欢
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多