C++ 在函数调用中调用sizeof会跳过实际调用函数!}

C++ 在函数调用中调用sizeof会跳过实际调用函数!},c++,sizeof,C++,Sizeof,我偶然发现了这段代码 int x(int a){ std::cout<<a<<std::endl; return a + 1; } int main() { std::cout<<sizeof(x(20))<<std::endl; return 0; } intx(inta){ std::coutsizeof实际上是一个运算符,它在编译时进行计算 编译器可以计算它,因为x的返回类型的大小是固定的;它在程序执行期间

我偶然发现了这段代码

int x(int a){
    std::cout<<a<<std::endl;
    return a + 1;
}

int main()
{
    std::cout<<sizeof(x(20))<<std::endl;
    return 0;
}
intx(inta){

std::cout
sizeof
实际上是一个运算符,它在编译时进行计算


编译器可以计算它,因为
x
的返回类型的大小是固定的;它在程序执行期间不能更改。

sizeof
实际上是一个运算符,它在编译时进行计算


编译器可以对其求值,因为
x
的返回类型的大小是固定的;它在程序执行过程中不能更改。

sizeof
是编译时运算符,操作数从不求值。

sizeof
是编译时运算符,操作数从不求值。

sizeof的结果是comp在C++中编译时,函数调用有x(20)

< p>>结果,所以C++中有函数调用到x(20)

<代码> siZeOf()>代码>给出了数据类型的大小。在这种情况下,不需要调用函数来获得数据类型。 我怀疑sizeof也在编译时而不是运行时处理它的事务…

sizeof()
给出了数据类型的大小。在您的情况下,它不需要调用函数来获取数据类型


我怀疑sizeof也在编译时而不是运行时完成它的工作…

让我引用c++03标准,5.3.3

sizeof运算符生成对象中的字节数 其操作数的表示形式。操作数可以是表达式, 未计算的,或括号中的type-id


让我引用c++03标准#5.3.3

sizeof运算符生成对象中的字节数 其操作数的表示形式。操作数可以是表达式, 未计算的,或括号中的type-id


代码不调用函数&mdash;它甚至不操纵指向函数的指针。代码不调用函数&mdash;它甚至不操纵指向函数的指针。谢谢!但正如我们看到的x()有打印到IO流的副作用。因为我们在编译时只知道sizeof的值,所以不调用该函数不是错误的吗?@ChethanRavindranath:不管函数做什么。
sizeof
是专门为避免表达式可能产生的任何和所有副作用而设计的。更重要的是,语言标准明确表示,
sizeof
的操作数是不求值的(这在某些元编程技术中非常重要,因为“被调用”函数甚至不存在。)谢谢!但正如我们看到的x()有打印到IO流的副作用。因为我们在编译时只知道sizeof的值,所以不调用该函数不是错误的吗?@ChethanRavindranath:不管函数做什么。
sizeof
是专门为避免表达式可能产生的任何和所有副作用而设计的。更重要的是,语言标准明确表示,
sizeof
的操作数是不计算的(这在某些元编程技术中非常重要,因为“被调用”函数甚至不存在)