我正在学习c编程。我一直在网上解决一些问题。我遇到了这个问题
#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");
}
由于(x==2)
会给0
因为条件不匹配,所以三元运算符会给i
short int
。\ n它的大小是2
,它与float
的大小不同。
但是这个程序正在打印浮动。有人能告诉我这是怎么可能的吗?
答案 0 :(得分:2)
不评估表达式,仅评估类型,以及
cond ? float : short int
&#34;普通类型&#34;将是float
。
答案 1 :(得分:0)
您在阅读时错过了一个sizeof
。
不是将{2}与sizeof(float)
进行比较;它将表达式的sizeof
与sizeof(float)
进行比较。
程序永远不会运行sizeof()
内的代码。如果代码运行,编译器会检查的类型。在这种情况下,三元组将返回float
或short int
。查看我们知道的代码,如果代码运行,它将返回i
的值,因为x == 2
为false,但由于编译器从不运行此代码,只能看到三元表达式中事物的类型。由于三元表达式可以是float
或int
,因此编译器使用更宽的类型(就像添加float和int时一样)。这就是sizeof
作为一个整体返回float
的相同大小的原因。
答案 2 :(得分:0)
您看到以下行的方式:
if (sizeof((x == 2) ? f : i) == sizeof(float))
时:
if (sizeof(short int) == sizeof(float)) // after expression is simlpified
但是,sizeof()
函数是编译时函数,而不是运行时函数。这意味着在运行sizeof()
函数之前,不会评估sizeof()
中缩短的if-else表达式,因为if-else语句是运行时表达式。因此,您的sizeof()
函数会看到以下内容:
if (sizeof (int ? float : short int) == sizeof (float)) {
如果if条件中的任何内容不为零,则if-condition默认情况下计算为 true 。因此,int
计算结果为true,因此传递给sizeof()
的参数将为float
。时间:
sizeof(float) == sizeof(float)
是的, float 将作为结果输出。
这导致你的第一个if语句成立。
答案 3 :(得分:0)
要添加到 nitpick已经存在的答案,引用C11
,章节§6.5.9,等于运算符,(强调我的 EM>)
==
(等于)和!=
(不等于)运算符类似于关系 运营商除了优先级较低外。如果是,则每个运算符都会产生1
指定的关系为true,如果为false,则为0
。 结果的类型为int
。
所以,你所写的内容相当于
if (sizeof( int ? float : short int) == sizeof(float))
使结果成立。