首页 > 解决方案 > 为什么函数上任何索引处的下标运算符在 C++ 中总是返回 1?

问题描述

这是我的代码。似乎 f[i] 在 i 的任何值处返回 1。

int f(int x) { return 203; }

int main(){
  cout<<f[0]<<' '<<f[21]<<' 'f[-1];//= 1 1 1
  return 0;
}

使用编译器抛出的警告,我知道这是一个指针,但它的行为似乎不像一个指针。

f[-2](1) // = 203, good
f[32](1) // Process returned -1073741571 (0xC00000FD)   execution time : 6.731 s

编辑:我使用带有 c++ 14 标志的 g++ 编译器。

标签: c++pointersfunction-pointers

解决方案


这是一个 GCC 扩展:

6.23 void- 和函数指针的算术运算

在 GNU C 中,指向 void 的指针和指向函数的指针支持加法和减法运算。这是通过将 avoid或函数的大小视为 1 来完成的。

这样做的结果是在函数类型sizeof上和函数类型上也允许这样做void,并返回 1。

如果调用不存在的函数的结果指针,很可能会崩溃或产生奇怪的结果。


似乎以任何值f[i]返回。1i

这是一个众所周知的行为cout。它将所有非零函数指针打印为1,因为它们没有适当的重载operator<<operator<<(bool)并被选为最合适的重载。

(f[i]是一个函数而不是函数指针,但在这种情况下它会衰减为一个指针。)


推荐阅读