<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>http://jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>http://jackxiang.com/post//</link>
<title><![CDATA[[C语言篇]C语言常见错误小结]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[WEB2.0]]></category>
<pubDate>Tue, 09 Jan 2007 05:11:27 +0000</pubDate> 
<guid>http://jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	<p align="left">C语言的最大特点是：功能强、使用方便灵活。C编译的程序对语法检查并不象其它高级语<br/>言那么严格，这就给编程人员留下“灵活的余地”，但还是由于这个灵活给程序的调试带<br/>来了许多不便，尤其对初学C语言的人来说，经常会出一些连自己都不知道错在哪里的错误<br/>。看着有错的程序，不知该如何改起，本人通过对C的学习，积累了一些C编程时常犯的错<br/>误，写给各位学员以供参考。 &nbsp;<br/><br/>1.书写标识符时，忽略了大小写字母的区别。 <br/>main() <br/>&#123; <br/>int a=5; <br/>printf("%d",A); <br/>&#125; <br/>编译程序把a和A认为是两个不同的变量名，而显示出错信息。C认为大写字母和小写字母是<br/>两个不同的字符。习惯上，符号常量名用大写，变量名用小写表示，以增加可读性。 <br/><br/>2.忽略了变量的类型，进行了不合法的运算。 <br/>main() <br/>&#123; <br/>float a,b; <br/>printf("%d",a%b); <br/>&#125; <br/>%是求余运算，得到a/b的整余数。整型变量a和b可以进行求余运算，而实型变量则不允许<br/>进行“求余”运算。 <br/><br/>3.将字符常量与字符串常量混淆。 <br/>char c; <br/>c="a"; <br/>在这里就混淆了字符常量与字符串常量，字符常量是由一对单引号括起来的单个字符，字<br/>符串常量是一对双引号括起来的字符序列。C规定以“&#92;”作字符串结束标志，它是由系统<br/>自动加上的，所以字符串“a”实际上包含两个字符：‘a'和‘&#92;'，而把它赋给一个字符变<br/>量是不行的。 <br/><br/>4.忽略了“=”与“==”的区别。 <br/>在许多高级语言中，用“=”符号作为关系运算符“等于”。如在BASIC程序中 <br/>可以写 <br/>if (a=3) then … <br/>但C语言中，“=”是赋值运算符，“==”是关系运算符。如： <br/>if (a==3) a=b; <br/>前者是进行比较，a是否和3相等，后者表示如果a和3相等，把b值赋给a。由于习惯问题，<br/>初学者往往会犯这样的错误。 <br/><br/>5.忘记加分号。 <br/>分号是C语句中不可缺少的一部分，语句末尾必须有分号。 <br/>a=1 <br/>b=2 <br/>编译时，编译程序在“a=1”后面没发现分号，就把下一行“b=2”也作为上一行语句的一<br/>部分，这就会出现语法错误。改错时，有时在被指出有错的一行中&#92;未发现错误，就需要看<br/>一下上一行是否漏掉了分号。 <br/>&#123; z=x+y; <br/>t=z/100; <br/>printf("%f",t); <br/>&#125; <br/>对于复合语句来说，最后一个语句中最后的分号不能忽略不写(这是和PASCAL <br/>不同的)。 <br/><br/>6.多加分号。 <br/>对于一个复合语句，如： <br/>&#123; z=x+y; <br/>t=z/100; <br/>printf("%f",t); <br/>&#125;; <br/>复合语句的花括号后不应再加分号，否则将会画蛇添足。 <br/>又如： <br/>if (a%3==0); <br/>I++; <br/>本是如果3整除a，则I加1。但由于if (a%3==0)后多加了分号，则if语句到此结束，程序将<br/>执行I++语句，不论3是否整除a，I都将自动加1。 <br/>再如： <br/>for (I=0;I<5;I++); <br/>&#123;scanf("%d",&x); <br/>printf("%d",x);&#125; <br/>本意是先后输入5个数，每输入一个数后再将它输出。由于for()后多加了一个分号，使循<br/>环体变为空语句，此时只能输入一个数并输出它。 <br/><br/>7.输入变量时忘记加地址运算符“&”。 <br/>int a,b; <br/>scanf("%d%d",a,b); <br/>这是不合法的。Scanf函数的作用是：按照a、b在内存的地址将a、b的值存进去。“&a”指<br/>a在内存中的地址。 <br/><br/>8.输入数据的方式与要求不符。 <br/>①scanf("%d%d",&a,&b); <br/>输入时，不能用逗号作两个数据间的分隔符，如下面输入不合法： <br/>3，4 <br/>输入数据时，在两个数据之间以一个或多个空格间隔，也可用回车键，跳格键tab。 <br/>②scanf("%d,%d",&a,&b); <br/>C规定：如果在“格式控制”字符串中除了格式说明以外还有其它字符，则在输入数据时应<br/>输入与这些字符相同的字符。下面输入是合法的： <br/>3，4 <br/>此时不用逗号而用空格或其它字符是不对的。 <br/>3 4 3：4 <br/>又如： <br/>scanf("a=%d,b=%d",&a,&b); <br/>输入应如以下形式： <br/>a=3,b=4 <br/><br/>9.输入字符的格式与要求不一致。 <br/>在用“%c”格式输入字符时，“空格字符”和“转义字符”都作为有效字符输入。 <br/>scanf("%c%c%c",&c1,&c2,&c3); <br/>如输入a b c <br/>字符“a”送给c1，字符“ ”送给c2，字符“b”送给c3，因为%c只要求读入一个字符，后<br/>面不需要用空格作为两个字符的间隔。 <br/><br/>10.输入输出的数据类型与所用格式说明符不一致。 <br/>例如，a已定义为整型，b定义为实型 <br/>a=3;b=4.5; <br/>printf("%f%d&#92;n",a,b); <br/>编译时不给出出错信息，但运行结果将与原意不符。这种错误尤其需要注意。 <br/><br/>11.输入数据时，企图规定精度。 <br/>scanf("%7.2f",&a); <br/>这样做是不合法的，输入数据时不能规定精度。 <br/><br/>12.switch语句中漏写break语句。 <br/>例如：根据考试成绩的等级打印出百分制数段。 <br/>switch(grade) <br/>&#123; case 'A':printf("85~100&#92;n"); <br/>case 'B':printf("70~84&#92;n"); <br/>case 'C':printf("60~69&#92;n"); <br/>case 'D':printf("<60&#92;n"); <br/>default:printf("error&#92;n"); <br/>由于漏写了break语句，case只起标号的作用，而不起判断作用。因此，当grade值为A时，<br/>printf函数在执行完第一个语句后接着执行第二、三、四、五个printf函数语句。正确写<br/>法应在每个分支后再加上“break;”。例如 <br/>case 'A':printf("85~100&#92;n");break; <br/><br/>13.忽视了while和do-while语句在细节上的区别。 <br/>(1)main() <br/>&#123;int a=0,I; <br/>scanf("%d",&I); <br/>while(I<=10) <br/>&#123;a=a+I; <br/>I++; <br/>&#125; <br/>printf("%d",a); <br/>&#125; <br/>(2)main() <br/>&#123;int a=0,I; <br/>scanf("%d",&I); <br/>do <br/>&#123;a=a+I; <br/>I++; <br/>&#125;while(I<=10); <br/>printf("%d",a); <br/>&#125; <br/>可以看到，当输入I的值小于或等于10时，二者得到的结果相同。而当I>10时，二者结果就<br/>不同了。因为while循环是先判断后执行，而do-while循环是先执行后判断。对于大于10的<br/>数while循环一次也不执行循环体，而do-while语句则要执行一次循环体。 <br/><br/>14.定义数组时误用变量。 <br/>int n; <br/>scanf("%d",&n); <br/>int a[n]; <br/>数组名后用方括号括起来的是常量表达式，可以包括常量和符号常量。即C不允许对数组的<br/>大小作动态定义。 <br/><br/>15.在定义数组时，将定义的“元素个数”误认为是可使的最大下标值。 <br/>main() <br/>&#123;static int a[10]=&#123;1,2,3,4,5,6,7,8,9,10&#125;; <br/>printf("%d",a[10]); <br/>&#125; <br/>C语言规定：定义时用a[10]，表示a数组有10个元素。其下标值由0开始，所以数组元素a[<br/>10]是不存在的。 <br/><br/><br/>16.在不应加地址运算符&的位置加了地址运算符。 <br/>scanf("%s",&str); <br/>C语言编译系统对数组名的处理是：数组名代表该数组的起始地址，且scanf函数中的输入<br/>项是字符数组名，不必要再加地址符&。应改为：scanf("%s",str); <br/><br/>17.同时定义了形参和函数中的局部变量。 <br/>int max(x,y) <br/>int x,y,z; <br/>&#123;z=x>y?x:y; <br/>return(z); <br/>&#125; <br/>形参应该在函数体外定义，而局部变量应该在函数体内定义。应改为： <br/>int max(x,y) <br/>int x,y; <br/>&#123;int z; <br/>z=x>y?x:y; <br/>return(z); <br/>&#125; </p>
]]>
</description>
</item><item>
<link>http://jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] [C语言篇]C语言常见错误小结]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>