为何sizeof(x ++)不增长x?

这是在dev c ++窗口中编译的代码: 数组

#include <stdio.h>

int main() {
    int x = 5;
    printf("%d and ", sizeof(x++)); // note 1
    printf("%d\n", x); // note 2
    return 0;
}

我但愿在执行注释1x为6。 可是,输出为: app

4 and 5

谁能解释为何音符1以后x不会增长? 函数


#1楼

sizeof()运算符仅给出数据类型的大小,它不评估内部元素。 this


#2楼

注意 spa

此答案是从重复副本中合并而成的,这解释了延迟日期。 rest

原版的 code

除了可变长度数组, sizeof不会评估其参数。 咱们能够从C99标准草案第6.5.3.4“ sizeof运算符2段”中看到这一点: get

sizeof运算符产生其操做数的大小(以字节为单位),该操做数能够是表达式或类型的括号名称。 大小由操做数的类型肯定。 结果是一个整数。 若是操做数的类型是可变长度数组类型,则对操做数求值; 不然,不评估操做数,结果为整数常量。 io

一个注释( 现已删除 )询问这样的事情是否会在运行时评估: 编译

sizeof( char[x++]  ) ;

确实能够,像这样的东西也能够工做( 看到他们两个都活着 ):

sizeof( char[func()]  ) ;

由于它们都是可变长度数组。 虽然,我都没有发现任何实际用途。

注意,可变长度数组在C99标准草案6.7.5.2节“ 数组声明器”第4节中进行了介绍

[...]若是大小是整数常量表达式,而且元素类型具备已知的常量大小,则数组类型不是可变长度数组类型; 不然,数组类型为可变长度数组类型。

更新资料

在C11中,答案针对VLA状况而改变,在某些状况下,不肯定是否评估大小表达式。 从6.7.6.2节的数组声明 6.7.6.2

若是大小表达式是sizeof运算符的操做数的一部分,而且更改大小表达式的值不会影响该运算符的结果,则不肯定是否评估该大小表达式。

例如,在这种状况下( 现场观看 ):

sizeof( int (*)[x++] )

#3楼

sizeof在编译时运行,可是x++只能在运行时评估。 为了解决这个问题,C ++标准规定不对sizeof的操做数求值(VLA除外)。 C标准说:

若是[ sizeof ]的操做数的sizeof是可变长度数组类型,则对操做数求值; 不然,不评估操做数,结果为整数常量。


#4楼

sizeof是一个编译 sizeof 算符 ,所以在编译时sizeof及其操做数将被结果值替换。 彻底不评估操做数(除非它是可变长度数组); 仅结果的类型很重要。

short func(short x) {  // this function never gets called !!
   printf("%d", x);    // this print never happens
   return x;
}

int main() {
   printf("%d", sizeof(func(3))); // all that matters to sizeof is the 
                                  // return type of the function.
   return 0;
}

输出:

2

由于short在个人机器上占用2个字节。

将函数的返回类型更改成double

double func(short x) {
// rest all same

将给出8做为输出。


#5楼

来自C99标准 (重点是个人)

6.5.3.4/2

sizeof运算符产生其操做数的大小(以字节为单位),该操做数能够是表达式或类型的括号名称。 大小由操做数的类型肯定。 结果是一个整数。 若是操做数的类型是可变长度数组类型,则对操做数求值; 不然, 不评估操做数 ,结果为整数常量。

相关文章
相关标签/搜索