标题: C语言中size_t的陷阱
作者: Demon
链接: https://demon.tw/programming/c-size_t-pitfall.html
版权: 本博客的所有文章,都遵守“署名-非商业性使用-相同方式共享 2.5 中国大陆”协议条款。
今天写了一个类似这样的程序:
#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。
今后遇到有符号数和无符号数之间的运算时要千万小心。
赞赏微信赞赏支付宝赞赏
随机文章:
这个倒是没注意!
学习了!
刚在VS2008上试了,还好,有warning提示。
warning C4018: “>”: 有符号/无符号不匹配
根据《Effective C++》上说的,不放过编译器提示的任何一个Warning。
刚才我也试了一下,VC和BCC都有警告
但是我当时用的是Tiny C编译器,没有警告,奔泪
呵呵,Tiny C以前还不知道,学习了。
为啥-1会转化成这么大的数呢。。。