有人可以解释一下这个程序的输出是怎样的吗
Posted
技术标签:
【中文标题】有人可以解释一下这个程序的输出是怎样的吗【英文标题】:can some please explain how float is the output of this program 【发布时间】:2021-07-22 10:48:21 【问题描述】:请解释一下这个程序的输出是怎么浮动的 看不懂
#include <stdio.h>
int main()
int x = 1;
short int i = 2;
float f = 3;
if (sizeof((x == 2) ? f : i) == sizeof(float))
printf("float\n");
else if (sizeof((x == 2) ? f : i) == sizeof(short int))
printf("short int\n");
【问题讨论】:
【参考方案1】:确实,三元运算符并没有完全按照您的想法返回,但也不是 @user15790236 的想法。三元运算符 is 是一个运算符,因此它期望冒号两侧的参数类型相同。由于您有不同的类型,因此整数被提升为浮点数,因此表达式的类型为浮点数。
【讨论】:
详细信息:“整数被提升为浮点数”-->“short
被提升为 float
”(或更准确地说,“short
被提升为 int
,然后到float
")
我建议您还添加 ANSI C,float
是 IEEE 754 单精度二进制,所以 32 位 并且 int
类型大小依赖于实现(ANSI C 只要求它至少应为 16 位,无论如何大多数实际的常见实现都将其设置为 32 位)。
@Zilog80 有什么要备份的 ANSI C 将 float
指定为 IEEE 754 单精度二进制声明?
@chux-ReinstateMonica 也许我错了。在我看来,ISO/IEC TR 24732:2009 已包含在 C11 中?
整数被转换为float
。 C 标准使用单词“promotion”来表示整数提升和默认参数提升。这些是保留值的特定类型转换——它们只转换为更包容的类型,可以表示原始类型的所有值,因此是“提升”。相反,从整数类型到浮点类型的转换可能会更改值,具体取决于类型的详细信息。这种转换并不总是对包含类型的提升。【参考方案2】:
三元运算符的返回值与您想象的不完全一样。
( (x == 2) ? f : i )
实际上返回 i 的 value,它是按值计算的,然后被处理为 int,而不是短 int - 因此,根据您的 64 位编译器,大小为 4 个字节。换句话说,三元运算符的返回是 i 中的内容的副本,而不是 i 本身。
通过检查以下值向自己证明这一点:
sizeof(2)
要得到你所期望的,你可以说:
( (x==2) ? sizeof(f) : sizeof(i) )
您可能要考虑的下一个问题是,为什么编译器选择 int 作为类型,而 short 可以解决问题。看看Implicit type promotion rules
【讨论】:
试试double f = 3; if (sizeof((x == 2) ? f : i) == sizeof(double ))
。这将导致“然后被处理为双精度,而不是短整数”【参考方案3】:
从 C11 开始,要注意 类型,宁可尝试 sizeof(type)
比较,请使用 _Generic
。
#include <stdio.h>
#define type(X) _Generic((X), \
short: "short", \
int: "int", \
float: "float", \
double: "double", \
default: "default" \
)
int main(void)
int x = 1;
short int i = 2;
float f = 3;
puts(type(x));
puts(type(i));
puts(type(f));
puts(type((x == 2) ? f : i));
输出
int
short
float
float
(x == 2) ? f : i
是float
,正如@SGeorgiades 指出的那样,a?b:c
的类型是相同的,无论a
是否为真。
【讨论】:
以上是关于有人可以解释一下这个程序的输出是怎样的吗的主要内容,如果未能解决你的问题,请参考以下文章
返回新字符串(密码);有人可以解释一下,这是如何返回 String 的吗? [复制]