c++ - 为什么函数上任何索引处的下标运算符在 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++ 编译器。
解决方案
这是一个 GCC 扩展:
6.23
void
- 和函数指针的算术运算在 GNU C 中,指向 void 的指针和指向函数的指针支持加法和减法运算。这是通过将 a
void
或函数的大小视为 1 来完成的。这样做的结果是在函数类型
sizeof
上和函数类型上也允许这样做void
,并返回 1。
如果调用不存在的函数的结果指针,很可能会崩溃或产生奇怪的结果。
似乎以任何值
f[i]
返回。1
i
这是一个众所周知的行为cout
。它将所有非零函数指针打印为1
,因为它们没有适当的重载operator<<
,operator<<(bool)
并被选为最合适的重载。
(f[i]
是一个函数而不是函数指针,但在这种情况下它会衰减为一个指针。)
推荐阅读
- angular - 类型“any [] | undefined”不能分配给类型“any []”
- h2 - 在 H2 数据库中插入行哈希
- javascript - 在 ImageBackground 中添加要要求的变量
- wireless - LAN 上的无线显示
- c# - C# .net core 3.1 访问 Json 元素
- java - 在不使用集合的情况下过滤 java 流以获取可根据属性区分的不同对象
- javascript - 获取 lodash-es/lodash 类型/文档的正确方法
- ios - 嵌套在 UITableViewCell 中的 UITableViewCell 的自动维度
- javascript - Azure Idendity 平台重定向到主页,ensureAuth 失败
- r - R Shiny:无法访问反应性消费者之外的反应性价值