#include <stdio.h>
int main(void)
{
printf("%d", sizeof (getchar()) );
}
我想到的是, 1.键入输入。 2.阅读输入,并返回输入值。 3.评估的sizeof值。 4.打印的sizeof值。
但第一步从未发生过。
为什么不第一步发生的呢?
除非其类型是可变长度数组类型的sizeof
操作者不评价其操作数:它着眼于类型和返回该尺寸。这是绝对安全:
char *ptr = NULL; // NULL ponter!
printf("%zu", sizeof *ptr);
它会返回1
,因为它不必计算表达式就知道答案了。
我想到的是,1型输入。 2.阅读输入,并返回输入值。 3.评估的sizeof值4.打印的sizeof值。
但第一步从未发生过。为什么不第一步发生的呢?
因为,有极少数例外,该sizeof
运营商不评价它的操作数。您的使用是不是一个例外。不评估getchar()
意味着getchar()
不叫。
在任何情况下,我不知道你从你的代码的期望。即使getchar()
被称为,结果总是相同的类型(int
),它不依赖于输入。
难道也要注意@ P.P.的意见。您printf()
格式不匹配正在打印的数据的类型,size_t
。当他观察到,在printf()
呼叫未定义行为的结果。
在C sizeof运算符是在运行时只对可变大小的数组(VLA)进行评价。在其他情况下,操作者也没有评估它的操作数。它推导出表达式的类型,并返回推导类型的对象的大小。
由于getchar()
返回类型是int
,而不是char
。 sizeof(int)
是4你的平台上。
此外,你应该使用%zu
打印size_t
值。使用不正确的格式说明在技术上是undefined behaviour。