如预期为什么不和sizeof工作?

问题描述 投票:1回答:4
#include <stdio.h> 

int main(void) 
{   
    printf("%d", sizeof (getchar()) );
}

我想到的是, 1.键入输入。 2.阅读输入,并返回输入值。 3.评估的sizeof值。 4.打印的sizeof值。

但第一步从未发生过。

为什么不第一步发生的呢?

c printf sizeof
4个回答
4
投票

除非其类型是可变长度数组类型的sizeof操作者不评价其操作数:它着眼于类型和返回该尺寸。这是绝对安全:

char *ptr = NULL; // NULL ponter!
printf("%zu", sizeof *ptr);

它会返回1,因为它不必计算表达式就知道答案了。


2
投票

我想到的是,1型输入。 2.阅读输入,并返回输入值。 3.评估的sizeof值4.打印的sizeof值。

但第一步从未发生过。为什么不第一步发生的呢?

因为,有极少数例外,该sizeof运营商不评价它的操作数。您的使用是不是一个例外。不评估getchar()意味着getchar()不叫。

在任何情况下,我不知道你从你的代码的期望。即使getchar()被称为,结果总是相同的类型(int),它不依赖于输入。

难道也要注意@ P.P.的意见。您printf()格式不匹配正在打印的数据的类型,size_t。当他观察到,在printf()呼叫未定义行为的结果。


1
投票

在C sizeof运算符是在运行时只对可变大小的数组(VLA)进行评价。在其他情况下,操作者也没有评估它的操作数。它推导出表达式的类型,并返回推导类型的对象的大小。


1
投票

由于getchar()返回类型是int,而不是charsizeof(int)是4你的平台上。

此外,你应该使用%zu打印size_t值。使用不正确的格式说明在技术上是undefined behaviour

© www.soinside.com 2019 - 2024. All rights reserved.