短C代码:困惑的strlen()函数

时间:2013-02-03 16:54:15

标签: c

我的编译器: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?!!!) 谢谢你的帮助!

1 个答案:

答案 0 :(得分:10)

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

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

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

甚至更好:

if (i < strlen(text))

理解内置类型和运算符的算术促销和转换可能有点棘手,可能值得阅读。当然有一些意想不到的情况。当你comparing signed with unsigned types时,可以使用一个好的编译器来警告你。

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