为什么这些比较在 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 这样的表达式中,“较小”类型的操作数被转换为另一个操作数的类型。

这里的“更小”并不一定意味着位数更少,而是指给定的类型顺序:无符号类型 > 有符号类型,长类型 > 短类型,浮点类型 > 整数类型。

在您的情况下,您有 intsize_t,通常是 unsigned int(或 unsigned long)。

考虑到这一点,您的 2 个条件看起来会有点不同。

5 - i - 1int 类型,因为每个操作数都是 int 类型。 结果是 -15 > -1true.

strlen(s) - i - 1 中,所有操作数都将转换为 size_t,这意味着结果为 (size_t) -1,对于 32 位值,其计算结果为 2<<32-10xFFFFFFFF .现在 5 > 0xFFFFFFFFfalse.

这就是为什么您会根据不同的条件得到不同的结果。

要获得相同的结果,您还需要使 5 无符号。这可以通过使用 5u 来实现。