这几天在看那本《C和指针》 英文名《POINTERS ON C》[美]Keneth A.Reek著 徐波译
#include<stdio.h>
#include<string.h>
int main()
{
unsigned int a=1,b=2;
// if(a>b)printf("=%d", a-b);
if((a-b)>0)printf("Why it will output this:%d?",a-b);
/*
int len1,len2;
char buffer[] = "25,142,330,Smith,J,239-4123";
len1 = strspn(buffer,"0123456789");// ,不是字符串中的所以返回2
//若strspn()返回的数值为n,则代表字符串s 开头连续有n 个字符都是属于字符串accept内的字符。
len2 = strspn(buffer,",0123456789");//S不是字符串中的 所以返回S所在的11
printf("%d\n",len1);
printf("%d\n",len2);
*/
return 0;
}
我们会发现if语句执行了?这是为什么,因为unsigned 型的算数运算后还是unsigned型,这里用于差值后结果比较会产生问题,以后要注意。
我在notepad++配置VS的编译器后输出结果是这样的:
仔细看上面的程序你会发现问题:我这里输出a-b的printf值用的是%d,这样无论如何也会输出-1的,如果改成%u就正确了。
这里可以单步调试设置断点观测c=a-b的值:
归结起来:编程对于无符号的判断时候要注意,尽量不要杂入算数运算,否则会产生不易察觉的错误。对于输出时候也应注意%d、%u的区别,这个只在C语言中存在,在C++中不会出现这种问题,cout在这点中做的很好,这也算是C++的一个优势。
谨记、谨记。