繁体   English   中英

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

[英]Short C Code: Confused strlen() function

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

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

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

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

甚至更好:

if (i < strlen(text))

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM