为什么函数的任何索引的下标运算符在C ++中总是返回1?

时间:2018-07-14 21:35:05

标签: c++ pointers function-pointers

这是我的代码。似乎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 ++编译器。

1 个答案:

答案 0 :(得分:2)

这是GCC扩展名:

  

6.23 Arithmetic on void- and Function-Pointers

     

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

     

其结果是sizeof和函数类型上也允许void,并返回1。

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


  

似乎f[i]返回1的值为i

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

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