解释条件的执行?

时间:2017-03-16 17:05:36

标签: c

我正在学习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的大小不同。 但是这个程序正在打印浮动。有人能告诉我这是怎么可能的吗?

4 个答案:

答案 0 :(得分:2)

不评估表达式,仅评估类型,以及

cond ? float : short int

&#34;普通类型&#34;将是float

答案 1 :(得分:0)

您在阅读时错过了一个sizeof

不是将{2}与sizeof(float)进行比较;它将表达式的sizeofsizeof(float)进行比较。

程序永远不会运行sizeof()内的代码。如果代码运行,编译器会检查的类型。在这种情况下,三元组将返回floatshort int。查看我们知道的代码,如果代码运行,它将返回i的值,因为x == 2为false,但由于编译器从不运行此代码,只能看到三元表达式中事物的类型。由于三元表达式可以是floatint,因此编译器使用更宽的类型(就像添加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))

使结果成立。