增量运算符不适用于 sizeof
increment operator not working with sizeof
只是想知道为什么增量运算符在下面的代码片段中不起作用:
int main()
{
int a = 10;
int b = sizeof(a++);
cout<<"a: "<<a<<endl;
cout<<"b: "<<b<<endl;
return 0;
}
输出-
答:10
乙: 4
sizeof
不计算其参数。它在编译时静态计算参数的大小,而不会导致执行任何代码。
当 sizeof 的表达式类型不是可变修改的数组类型时,不会计算表达式,因为该类型在编译时是完全已知的。int
没有可变修改的部件。
在C++(至少C++11)中,没有可变修改的类型(至少不像C的概念那样 - 你可以争辩说new int[a++]
使用可变修改的数组类型;但类型不会转义到语言的任何其他部分。特别是,不要sizeof
),因此在C++中,永远不会计算 sizeof 的表达式。在 C 中,如果表达式不影响可变修改的数组类型的大小,则未指定是否计算表达式。例如
int main()
{
int a = 10;
int b = sizeof(int[a++ ? 1 : 1]);
cout<<"a: "<<a<<endl;
cout<<"b: "<<b<<endl;
return 0;
}
在C中(从C99开始),这可能会输出11
用于a
,但它也可能输出10
,这取决于编译器是否足够聪明,可以省略求值a++
,推断出int[10]
的大小是在编译时计算的。
脚注:可变修改的数组类型也称为 VLA(可变长度数组)类型。简而言之,可变修改类型是 VLA 类型或依赖于 VLA 类型的类型。例如int(*)[a++]
.
sizeof
运算符的操作数未使用,未计算。这是标准行为。
sizeof在C中不是函数。
它的参数并没有真正被计算,只有它的类型是,这是在编译时完成的。 在您的代码中,赋值等效于(在您的体系结构中):
int b = 4
在未计算的上下文中,只有类型很重要。调用函数时也会发生同样的情况:
void f();
sizeof(f()); // f not called
相关文章:
- FLTK 2.0构建和演示,适用于VS2019的2011年左右的代码库
- C++17 - 使用自定义分配器的节点提取/重新插入 - 适用于 clang++/libc++,但不适用于 libstd
- "string.h"在构建适用于iOS的qt应用程序中找不到消息
- 适用于 WebView2 旧版本的示例应用程序
- 为什么数组大小信息可用于"sizeof"运算符和 delete[] 运算符,但在将数组作为参数传递到
- 在 NVIDIA GEFORCE GTX 1050 上下载适用于 Windows 10 的 openCL 1.2
- __attribute__(优化(0))) 是否适用于"recursively"?
- 为什么 std::erase(std::erase_if) 不是适用于<algorithm>任何容器的模板?
- 使用一个参数的模板函数时出错(适用于 2)
- 使用 适用于 Android 和 iOS 的 tf-lite C++ API
- 为什么这适用于 G++ 而不是 CLANG?
- 适用于 macOS 的 Xcode 应用程序。这就是我设置从USB麦克风输入获取音频的方式。一年前工作,现在没有了。为什么
- 适用于 Linux 的 c++ 上的代理脚本
- 为什么我的 SFINAE 表达式不再适用于 GCC 8.2?
- 使输出流式处理运算符适用于 boost::variant<std::vector<int>、int、double 的正确方法是什么>
- 有没有适用于Windows.lib文件的GNU二进制文件描述符(BFD)
- 模板函数仅适用于VS
- 如何在cmake中包含适用于g++或viceversa的库
- 适用于win32、linux、mac的POSIX C包装器
- sizeof 如何适用于 int 类型