C语言中size_t的陷阱

标签: , , ,

今天写了一个类似这样的程序:

#include <stdio.h>
#include <string.h>
int main()
{
    int i = -1;
    if(i > strlen("Demon"))
        printf("Hello World");
    else
        printf("Hello Demon");
    return 0;
}

输出的竟然是Hello World!-1 > 5?!

仔细想想,原来问题出在strlen上,strlen返回的类型是size_t,size_t的定义为:

typedef unsigned int size_t;

即无符号的整型,而i的类型是int,即有符号的整型。当有符号整型和无符号整型进行运算时,有符号整型会先自动转化成无符号。-1转化成无符号数为4294967295,远远大于5。

今后遇到有符号数和无符号数之间的运算时要千万小心。

赞赏

微信赞赏支付宝赞赏

随机文章:

  1. 人人网状态及评论导出工具
  2. 伪造电子邮件发送时间
  3. C语言strlcpy函数的实现
  4. 48行计算24点C语言代码
  5. 用VBS获取Unix时间戳

5 条评论 发表在“C语言中size_t的陷阱”上

  1. Tanky Woo说道:

    这个倒是没注意!
    学习了!

  2. Tanky Woo说道:

    刚在VS2008上试了,还好,有warning提示。
    warning C4018: “>”: 有符号/无符号不匹配

    根据《Effective C++》上说的,不放过编译器提示的任何一个Warning。

  3. lidaof说道:

    为啥-1会转化成这么大的数呢。。。

留下回复