2

我的编译器:Dev C++ 5.3.0.3 TDM-GCC 4.6.1 64 位我的操作系统:Windows 7、64 位

我的 C 代码:

# include "stdio.h"
# include "string.h"

# define MAX (501)

int main() {
    char
        text[MAX]="";

    int i;

    i=0;
    printf("%d\n",strlen(text));        /* 0 */
    printf("%d\n",(strlen(text)-1));    /* -1 */
    if ( i<= (strlen(text)-1) ) printf("haha"); /* haha */

    return 0;
}

我的问题:为什么要打印“哈哈”?! ( 0>-1 ?!!!) 感谢您的帮助!

4

1 回答 1

10

strlen返回一个无符号值,并且对无符号整数i < strlen(text) - 1执行比较,其中确实不大于另一个。0

在处理无符号类型时,如果只使用 ,则更容易推理+

if (i + 1 <= strlen(text))

甚至更好:

if (i < strlen(text))

理解内置类型和运算符的算术提升和转换可能有点棘手,可能值得一读。肯定有一些意想不到的情况。可以制作一个好的编译器来警告你comparing signed with unsigned types

(如果您很好奇为什么在一个同时具有有符号和无符号类型的表达式中都被提升为无符号,您可能会注意到从有符号到无符号的转换是绝对明确定义的(通过模算术),而从无符号到有符号的转换是实现定义。我想这意味着提升规则意味着算术运算和比较的行为是明确定义的,而不仅仅是实现定义的。)

于 2013-02-03T16:55:54.420 回答