以下代码片段无法按预期工作,以下程序的输出为" S为Bigger"在Ubuntu机器上使用GCC编译时。虽然变量s是-1并且明显小于sizeof(缓冲区)20,但仍然打印 S更大。
我唯一可以做出的逻辑假设就是C正在转换变量" s"到无符号整数并在&#34中使用;如果"条件。 如果我的假设是正确的,为什么C正在这样做,或者如果我错了,为什么这个片段会给出这个令人困惑的输出。
#include <stdio.h>
int main(void) {
int s = -1;
char buffer[20];
if(s > sizeof(buffer)){
printf("S is Bigger");
}
return 0;
}
答案 0 :(得分:4)
答案 1 :(得分:3)
您是对的,编译器会将s
转换为unsigned int
数据类型size_t
(这是sizeof运算符的返回值)。所以比较成了(在我的系统中size_t是64位):
if (18446744073709551615 > 20)
这显然是真的;)
这是标准定义的隐式转化的一部分。相关部分是标准的6.3.1.8中的“常用算术转换”。
基本规则: