为什么sizeof(x ++)不增加x?

╄→尐↘猪︶ㄣ 提交于 2020-02-26 23:36:15

这是在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。 但是,输出为:

4 and 5

谁能解释为什么音符1之后x不会增加?


#1楼

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


#2楼

注意

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

原版的

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

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

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

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运算符产生其操作数的大小(以字节为单位),该操作数可以是表达式或类型的括号名称。 大小由操作数的类型确定。 结果是一个整数。 如果操作数的类型是可变长度数组类型,则对操作数求值; 否则, 不评估操作数 ,结果为整数常量。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!