为什么 sizeof 没有按预期工作?
Why doesn't sizeof work as expected?
#include <stdio.h>
int main(void)
{
printf("%d", sizeof (getchar()) );
}
我期望的是,
1. 键入输入。
2.读取输入和return输入值。
3. 计算sizeof值。
4. 打印 sizeof 值。
但第一步永远不会发生。
为什么第一步没有发生?
因为 getchar()
return 类型是 int
,而不是 char
。 sizeof(int)
在您的平台上是 4。
此外,您应该使用 %zu
打印 size_t
值。使用不正确的格式说明符在技术上是 undefined behaviour.
sizeof
运算符不评估其操作数,除非其类型是可变长度数组类型:它查看类型并 returns 大小。这是绝对安全的:
char *ptr = NULL; // NULL ponter!
printf("%zu", sizeof *ptr);
它将 return 1
,因为它不必计算表达式就可以知道答案。
What I expect is, 1. Type input. 2. Read input and return input value. 3. Evaluate sizeof value 4. Print the sizeof value.
But the first step never happens. Why doesn't the first step happen?
因为,除了极少数例外,sizeof
运算符不会计算其操作数。您的用法不是例外之一。不评估 getchar()
意味着 getchar()
未被调用。
无论如何,我不确定您对代码的期望是什么。即使 getchar()
被 调用,结果总是具有相同的类型 (int
),这与输入无关。
也请注意@P.P.的评论。您的 printf()
格式与正在打印的数据类型不匹配,size_t
。据他观察,printf()
调用因此具有未定义的行为。
在 C 中,sizeof 运算符仅在 运行 时计算可变大小数组 (VLA)。在所有其他情况下,运算符既不评估其操作数。它推导表达式的类型和returns推导类型的对象的大小。
#include <stdio.h>
int main(void)
{
printf("%d", sizeof (getchar()) );
}
我期望的是,
1. 键入输入。
2.读取输入和return输入值。
3. 计算sizeof值。
4. 打印 sizeof 值。
但第一步永远不会发生。
为什么第一步没有发生?
因为 getchar()
return 类型是 int
,而不是 char
。 sizeof(int)
在您的平台上是 4。
此外,您应该使用 %zu
打印 size_t
值。使用不正确的格式说明符在技术上是 undefined behaviour.
sizeof
运算符不评估其操作数,除非其类型是可变长度数组类型:它查看类型并 returns 大小。这是绝对安全的:
char *ptr = NULL; // NULL ponter!
printf("%zu", sizeof *ptr);
它将 return 1
,因为它不必计算表达式就可以知道答案。
What I expect is, 1. Type input. 2. Read input and return input value. 3. Evaluate sizeof value 4. Print the sizeof value.
But the first step never happens. Why doesn't the first step happen?
因为,除了极少数例外,sizeof
运算符不会计算其操作数。您的用法不是例外之一。不评估 getchar()
意味着 getchar()
未被调用。
无论如何,我不确定您对代码的期望是什么。即使 getchar()
被 调用,结果总是具有相同的类型 (int
),这与输入无关。
也请注意@P.P.的评论。您的 printf()
格式与正在打印的数据类型不匹配,size_t
。据他观察,printf()
调用因此具有未定义的行为。
在 C 中,sizeof 运算符仅在 运行 时计算可变大小数组 (VLA)。在所有其他情况下,运算符既不评估其操作数。它推导表达式的类型和returns推导类型的对象的大小。