无符号变量注意错误小点(不会常见,但是见到了估计一时半会也找不到问题)

这几天在看那本《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的值:

无符号变量注意错误小点(不会常见,但是见到了估计一时半会也找不到问题)_第1张图片


 


归结起来:编程对于无符号的判断时候要注意,尽量不要杂入算数运算,否则会产生不易察觉的错误。对于输出时候也应注意%d、%u的区别,这个只在C语言中存在,在C++中不会出现这种问题,cout在这点中做的很好,这也算是C++的一个优势。

谨记、谨记。



你可能感兴趣的:(无符号变量注意错误小点(不会常见,但是见到了估计一时半会也找不到问题))