为什么这些比较在 C 中在数学上相同时却给我不同的答案?
why are those comparisons giving me a different answer when they are mathematically the same in C?
char s[]="hello";
int i=5;
if(5>strlen(s)-i-1) printf("ok");
if(5>5-i-1) printf("ok2");
上面程序的输出将是 ok2,这很奇怪,因为条件的值是相同的,我不明白为什么它不进入第一个 if 语句。
您需要了解常用算术转换的规则。
在像 a-b
这样的表达式中,“较小”类型的操作数被转换为另一个操作数的类型。
这里的“更小”并不一定意味着位数更少,而是指给定的类型顺序:无符号类型 > 有符号类型,长类型 > 短类型,浮点类型 > 整数类型。
在您的情况下,您有 int
和 size_t
,通常是 unsigned int
(或 unsigned long
)。
考虑到这一点,您的 2 个条件看起来会有点不同。
5 - i - 1
是 int
类型,因为每个操作数都是 int
类型。
结果是 -1
而 5 > -1
是 true
.
在 strlen(s) - i - 1
中,所有操作数都将转换为 size_t
,这意味着结果为 (size_t) -1
,对于 32 位值,其计算结果为 2<<32-1
或 0xFFFFFFFF
.现在 5 > 0xFFFFFFFF
是 false
.
这就是为什么您会根据不同的条件得到不同的结果。
要获得相同的结果,您还需要使 5
无符号。这可以通过使用 5u
来实现。
char s[]="hello";
int i=5;
if(5>strlen(s)-i-1) printf("ok");
if(5>5-i-1) printf("ok2");
上面程序的输出将是 ok2,这很奇怪,因为条件的值是相同的,我不明白为什么它不进入第一个 if 语句。
您需要了解常用算术转换的规则。
在像 a-b
这样的表达式中,“较小”类型的操作数被转换为另一个操作数的类型。
这里的“更小”并不一定意味着位数更少,而是指给定的类型顺序:无符号类型 > 有符号类型,长类型 > 短类型,浮点类型 > 整数类型。
在您的情况下,您有 int
和 size_t
,通常是 unsigned int
(或 unsigned long
)。
考虑到这一点,您的 2 个条件看起来会有点不同。
5 - i - 1
是 int
类型,因为每个操作数都是 int
类型。
结果是 -1
而 5 > -1
是 true
.
在 strlen(s) - i - 1
中,所有操作数都将转换为 size_t
,这意味着结果为 (size_t) -1
,对于 32 位值,其计算结果为 2<<32-1
或 0xFFFFFFFF
.现在 5 > 0xFFFFFFFF
是 false
.
这就是为什么您会根据不同的条件得到不同的结果。
要获得相同的结果,您还需要使 5
无符号。这可以通过使用 5u
来实现。