这几天在看那本《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++的一个优势。
谨记、谨记。