关于C语言三元运算符返回值的入门疑问:比较结果为何不符预期?
问题原因解析
第一个代码输出0的原因
宏SZIE定义的1024属于int类型,-1同样是int类型,所以表达式SZIE < -1是两个有符号整数的直接比较。1024是正数,显然大于-1,条件不成立,因此输出0。你之前误以为-1会被转换为SIZE_MAX,但这个转换只有在操作数涉及无符号类型时才会触发,而这里两边都是有符号int,不会触发该转换。
第二个代码输出1的原因
当你显式将-1转换为size_t(无符号整数类型)后,根据C语言的寻常算术转换规则,另一个操作数SZIE(int类型)会被隐式转换为size_t类型:
- 1024转换为
size_t后仍是1024; (size_t)-1等价于SIZE_MAX(无符号整数类型的最大值)。
此时表达式变成1024 < SIZE_MAX,显然成立,因此输出1。
核心规则总结
C语言中,只有当有符号整数和无符号整数进行运算/比较时,有符号整数才会被转换为无符号整数类型;若两个操作数同为有符号整数,则直接按有符号规则处理,不会触发无符号转换。
内容的提问来源于stack exchange,提问作者cy1
相关产品推荐
相关产品推荐

