You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

条件运算符的类型/大小疑问及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");
    return 0;
}

1. 为何这段代码输出“float”?

这是C语言条件运算符的类型提升规则导致的:条件运算符?:的两个操作数(f为float,i为short int)会遵循C的常规算术转换规则做类型提升。short int先提升为int,之后int与float运算时,int会进一步转换为float,因此整个(x==2)?f:i表达式的静态类型是float。sizeof是编译期运算符,计算的是表达式的静态类型大小,所以结果等于sizeof(float),进入第一个分支输出float。

注意:这里的类型提升和x==2的运行结果无关,编译器只看表达式的静态类型。

2. 为何sizeof(x==2)的结果为4?

x==2是关系表达式,C语言中关系表达式的返回值类型固定为int:关系成立返回1,不成立返回0,均为int类型。在多数32位/64位系统中,int的大小是4字节,因此sizeof(x==2)的结果是4。

3. 代码流程图

开始
|
V
定义变量x=1, i=2, f=3
|
V
计算sizeof((x==2)?f:i),得到float类型的大小
|
V
判断:该大小是否等于sizeof(float)?
|       是
|       V
|   输出"float"
|       |
|       V
|   结束
否
|
V
判断:该大小是否等于sizeof(short int)?
|       是
|       V
|   输出"short int"
|       |
|       V
|   结束
否
|
V
结束

4. 为何表达式sizeof((x == 2)? f : i) == sizeof(float)的结果为真(1)?

原因和问题1一致:条件运算符的两个操作数触发常规算术转换:

  1. short int类型的i先被提升为int;
  2. int与float运算时,int会转换为float;
  3. 整个条件表达式的静态类型为float,sizeof计算的就是float的大小,因此和sizeof(float)相等,表达式结果为真(1)。

内容的提问来源于stack exchange,提问作者premdanav

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 04:50:34