C语言中的三元运算符

3
#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");
}

输出结果是“float”。因此,我不明白为什么sizeof((x==2)?f:i)总是返回4。 我认为在(x==2)?f:i;处缺少变量声明。但它总是返回4(sizeof(f))
你能帮助我吗!这是我学习的第一种编程语言。我知道这个问题很愚蠢,但对我来说很难。感谢您花费时间:)祝您有一个愉快的一天;)
还有,这是我第一次尝试使用Stackoverflow,可能会有一些错误。希望您原谅我。

表达式 a ? b : c一个 确定的类型,它不取决于 a:它仅取决于 bc,并且这个 一个 类型在编译时确定。0 ? 42 : 3.14 的类型为 double,值为 3.141 ? 42 : 3.14 的类型为 double,值为 42.0 - pmg
这些都很清楚,但我仍然想知道,OP想要实现什么...我曾经简单地认为我知道了,但是... - Ctx
谢谢您的回答。我还有一个问题,如果表达式不依赖于a,那么您怎么知道表达式依赖于b或c? - Stack
1
@HoangLam 不仅是“b或c”,而是“b和c”。它遵循隐式转换规则,并具有与例如b + c相同的类型。 - Ctx
1个回答

7

一种表达式在编译时静态推导出其类型。

因此,在编译时已知 (x == 2) ? f : i 表达式的类型和大小,无论变量值如何,它在运行时不会改变。

在这种情况下,三元运算符的结果类型使用通常的算术转换来确定 (C99 6.5.15p5C99 6.3.1.8p1)。 (x == 2) ? f : i 的类型确定为float

整个 sizeof((x == 2) ? f : i) 在编译时进行求值,并且等于 sizeof(float)

您可以将 x == 2 移出 sizeof,以便在运行时求值:

if ((x == 2 ? sizeof(f) : sizeof(i)) == sizeof(float))

需要注意的是,sizeof(short int) == sizeof(float) 的情况可能会发生。


是的,我明白了,“任何非零值都为真。等于零的值为假”,这意味着Expression1可能是逻辑或非逻辑表达式。如果Expression1不等于0,则为真,等于0则为假,对吗? - Stack
1
没错,"逻辑表达式"这个东西并不存在。表达式的结果会与0进行字面比较。例如,比较运算符如==或!=只会返回一个值为0或1的int类型。 - KamilCuk
非常感谢,C语言是第一门语言,有很多东西需要学习。祝你有美好的一天 <3 - Stack
1
哦,我猜你所说的“小于”是指整数提升的“转换等级”。但是,转换等级仅适用于整数类型 - 浮点类型没有转换等级。但是,从某种意义上说,它确实像float比所有整数具有更高的转换等级一样工作。 - KamilCuk
1
fi都是short int类型时,它们在进行_通常算术转换_时首先会隐式地进行_整数提升_,将它们转换为int类型。根据cppreference中的4) 否则,两个操作数都是整数。两个操作数都要经过整数提升,以下是整数提升是将任何秩小于或等于int的整数类型的值隐式转换为int或unsigned int。因此它变成了sizeof(int)。而且在您的平台上,很可能sizeof(int)=sizeof(float) - KamilCuk
显示剩余9条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接