2016-07-29 112 views
1

我期望的是,
1.类型输入。
2.读取输入并返回输入值。
3.评估值的大小。
4.打印sizeof值。为什么sizeof按预期工作?

但是第一步从未发生。

为什么不第一步发生?

+0

我得到这个:[ICS @蒸汽男孩ics_client] $ gcc的-o临时temp.c [ICS @蒸汽男孩ics_client] $ ./temp 4 [ICS @蒸汽男孩ics_client] $什么平台是你吗? – octopusgrabbus

+1

你也应该在你的格式化字符串的末尾添加一个'\ n'。 –

回答

4

sizeof()函数不会评估括号中的内容:它会查看类型并返回大小。这是绝对安全:

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

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

+1

“这非常安全:” - >不是真的。 sizeof'的结果类型是'size_t'。匹配的'printf()'说明符是'“%zu”',而不是'“%d”'。 – chux

1

因为getchar()返回类型是int而不是charsizeof(int)在您的平台上是4。

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

2

我期望的是,1.类型输入。 2.读取输入并返回输入值。 3.评估sizeof值4.打印sizeof值。

但是第一步从未发生。为什么不迈出第一步?

因为除极少数例外情况,sizeof运算符不会评估其操作数。您的使用情况不是例外情况之一。未评估getchar()表示getchar()未被调用。

无论如何,我不确定你期望从你的代码中得到什么。即使调用getchar(),结果总是具有相同的类型(int),它不依赖于输入。

也请关注@P.P.的评论。您的printf()格式与正在打印的数据类型不匹配,size_t。正如他所观察到的,printf()调用的结果是未定义的行为。

1

在C中,sizeof运算符仅在运行时对可变大小数组(VLA)进行评估。在所有其他情况下,操作员不会评估操作数。它推导出表达式的类型并返回推导类型的对象的大小。

相关问题