条件运算符的类型/大小疑问及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一致:条件运算符的两个操作数触发常规算术转换:
short int类型的i先被提升为int;int与float运算时,int会转换为float;- 整个条件表达式的静态类型为
float,sizeof计算的就是float的大小,因此和sizeof(float)相等,表达式结果为真(1)。
内容的提问来源于stack exchange,提问作者premdanav
相关产品推荐
相关产品推荐

