C语言难点汇总_第1页
C语言难点汇总_第2页
C语言难点汇总_第3页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、个人精品文档,值得您的拥有C 语言难点汇总1. 二制数中原码 .反码 .补码以及进制之间的转换 :原码 :由符号位和该数的绝对值的二进制数组成.反码 :负数的反码为除符号位以外所有位均取反的结果 .正数的反码与原码相同 ,其补码也一样 ,后面不说了 .补码 :负数的补码是在其反码的基础之上加 1; 下面以 -123 为例求其各码 :原码 :符号位为1,二进制数为1111011,(其转换参考下面进制的转换)所以其原码为 11111011.反码 :10000100补码 :10000101进制的转换 :十进制数转其他 :(1):整数 :以十进制数 123 转换为八进制数为例 :123/8=15 3-

2、 最低位15/8=1 71/8=0 1- 最高位结果就是 173(从下到上 ),商为 0 止(2):小数 :0.325 转换为二制数为例 :乘 2 纯小数部分整数部分2 * 0.375=0.750 0.750 01/10个人精品文档,值得您的拥有2 * 0.750=1.5 0.5 12*0.5=1.001结果就为 0.011(从上到下 ),纯小数为 0 终止 .否则一直进行下去直到字节数已满 .其它转十进制 :以十六进制数 A5FE 转换十进制数为例 :A5FE=A * 163+5 *162+F * 161+E=42494二进制数 :十进制数不用说了 ,转八进制数时 ,从低位起 ,每三位对一位

3、 ,不足补 0; 转十六进制数 ,从低位起每四位对一位 ,不足补 0;其它转二进制数是一个相反的过程 .下面举两个例子 :(1);二进制数 10101101 转八进制数 :010 101 101| | |2 5 5结果就是 255(2):十六进制 A69E 数转二制数 :A69E|1010 0110 1001 1110结果就是 111102/10个人精品文档,值得您的拥有2. 变量在内在中的存放与转换 .(1) 存放 :整型数据是转换成相应的补码后直接存放在内存中,而实型与整型的存放不同 ,它是以指数形式存放,即符号位 +小数部分 +指数部分 .比如:12345在内在中的存放形式是这样的 :第

4、一位符号位是 +接,下来存放的是小数 ,即 0.12345,最后是指数 5,而小数部分和指数部分所占的位数因编译系统的不同而不同 ,不必深究 ,(2) 转换 :所有可以转换的数据类型之间的转换都遵循一个规则:按存储单元的存储形式直接传送,从低位开始 .比如 :将十进制数 -123 转换为八进制数: 将其补码原样传送由于八进制数无符号 (十六进制数也一样 ),所以最高位的 1 在八进制数的内在单元中已不代表符号 ,而代表数值进行运算 .不同的编译器和机器所得的结果不一定相同 ,因为整型变量所占的字节数不同 ,现以十六位机 (另外还与编译器有关 ,假如整型占两个字节 )为例 :-123 的补码为

5、1111111110000101,将其换算成八进制数为 177605,而在 32 位机上 (假如整形占 4 个字节 ), 其结果就是37777777605.实型转换成整型时 ,得到的绝不是你想要的结果 ,因为实型的存储形式是按指数形式存储的 ,低位中存储的是指数部分 ,当传送的时候 ,只是将指数部分或指数部分加上小数部分的小部分传送给整型变量,得到的结果不可能是你想要的结果.3/10个人精品文档,值得您的拥有3.字符 - 的作用 :与一些字母组成转义字符 ,比如 t、n 之类的 ,与数字组成代表八进制数 . 比如 :123 代表八进制数 123 即十进制数 83.另外说明一下 r,其作用是将当

6、前位置移到本行开头 ,后面再输入字符时 ,原有的字符将会被覆盖 , 比如 printf( “abcdn“);将会输出 ” cd 而”,不是 ” abcd还”有.b 也是一样 .4.自增自减 :(1).运算符在前时 ,先进行运算再进行取值 ,运算符在后时 ,先进行取值再进行运算 .比如 a=+i ; 相当于 i=i+1;a=i ; , 而 a=i+; 则相当于 a=i;i=i+1;(2).自增自减运算符不能用于常量 (表达式结果也是常量 ),只能用于变量 .(3).警告 :不要使用 +,- 之类的运算符 ,不同的编译器有不同的结果 , 也不要在一个式子中对同一变量进行多次+或-,比如:(i+)+

7、(i+)+(i+), 同样不同的编译器会得到不同的结果 .5.逗号运算符 .结合方向是自左向右,结果为最后一个表达式的值,其优先级最低 .注4/10个人精品文档,值得您的拥有意函数中的 ”,一”般是参数分隔符 ,不是逗号运算符 ,详情见 44 楼:6.退出过程 .(1)continue :用于结束某次循环继续下一循环.(2)break: 用于结束循环或结束switch 语句 .(3)return: 用于结束某函数 .(4)exit: 用于结束某一程序7.printf("%*sn",M," 字符串 "+N) 的用法说明先看 N 的值 ,去掉字符串的左边N

8、个字符 ,再看字符串的位数与M 的值的大小1.若字符串的位数比M 大,然后输出2.若字符串的位数比M 小,就先在 M 的左边补空格 ,使字符串的长度等于 M, 然后输出printf("%-*sn",M," 字符串 "+N),先看 N 的值 ,去掉字符串的左边N 个字符 ,再看字符串的位数与M 的值的大小1.若字符串的位数比M 大,然后输出2.若字符串的位数比M 小,就先在 M 的右边补空格 ,使字符串的长度等5/10个人精品文档,值得您的拥有于 M, 然后输出8.scanf 函数的用法和说明(1), 指 定 输 入 列 数 , 系 统自 动 截 取 ,

9、比 如 :scanf(“%3d”,&a);输入1234;a=123;(2).* 的用法 , 跳 过指定列数 . 比scanf( “%2d%*3d%d”a,&b); 输入1234567,a=12,b=67;345被跳过(3).输入时不能指定精度(4).输入数据时要与格式控制保持一致,格式控制中用 ”,分”开 ,输入时也要用 ”,分”开 ,格式控制中用 ”:分”开 ,输入时也要用 ”:分”开 , 否则结果不可预料 .如果格式控制中没有用任何字符隔开,你也不要用任何字符隔开 ,包括空格 ,比如 :scanf( “%c%c”,&a,&b);如果输入 a b (中间有空格

10、),此时 a=a,b=而,b却存入缓存中 .另外格式控制后是变量地址 ,普通变量不要忘了取地址运算符 ”&”本.来代表地址的也不要多加 ”&”. 比如指针 (数组名也是指针 )不用加 ”&”.(5).清除缓存 .当缓存中有数据时 ,使用 scanf 时,不会提示输入字符 ,而是直接将缓存中的数据(包括回车符 )赋给变量 ,直到缓存中没有变量.这样就要在调用scanf 之前清除缓存 ,用语句 fflush(stdin); 来清除缓存 .另外用scanf( “%c”,&a);在格式控制中多加一个空格可以清除一个字符,当有多个字符时就不有完全清除,还可以用* 来清除缓

11、存 ,和空格作用差不多 ,比如 :scanf( “%*5c%c”,&a);可以清除缓存中五个字符.最6/10个人精品文档,值得您的拥有好是直接用 fflush (stdin);9.易错点(1).if (a=4)相当;于 a=4;if(4);(2).switch 语句要注意 break;(3).do while;要注意最后一个分号不能丢(4).不能定义动态数组 ,比如 :scanf (“%d”,&n); int an;10.void 的说明 .Void 代表空类型 ,在定义指针变量或函数时可以定义为void 型,定义指针变量后可以在用的时候通过强制类型转换使其指向任何类型的数据.

12、定义函数时 ,只是说明不能有返回值 .如果函数中出现 return 就会报错.11.局部变量 .全局变量作用域 :局部变量的作用域从定义处到该过程(可以是一个复合语句也可以是一个函数 )结束 .全局变量的作用域从定义处到文件结束.存在性 :局部变量 (未声明为 static 类型 )当所在过程被调用时存在 ,结束后释放 ,如果定义为 static 就会一直存在直到程序结束 ,但其作用域不7/10个人精品文档,值得您的拥有受影响 .全局变量在被定义后就一直存在.直到程序结束 .优先级 :当两个相同变量的作用域重复 (一个包含另一个 ),在较小的作用域范围内 ,较大作用域的那个变量被屏蔽 .比如

13、:i 被定义为一个全局变量 ,在其作用域内又定义了一个局部变量i,在局部变量i 作用域内 ,全局变量i 被屏蔽 .又如 .在一个函数中定义了一个局部变量i,而在该函数的某个复合语句中又定义了一个变量i, 则在该复合语句中局部变量 i 将被屏蔽 .12.预编译处理命令#define:宏定义只是在编译前对代码作简单的字符串替换,不会考虑任何错误 .宏定义不是语句 ,后面不要加 "".#include:“”与< >之前的区别 . ”“是从用户当前目录寻找包含文件 ,若找不到就会到库函数所在目录中寻找 ,再找不到就报错 ,而< >则是直接在库函数所在目录中寻

14、找 ,找不到报错 .13.指针 :(1).指针的加减法 :指针的加减法不是作简单的加减,而是以指针变量所占的字节数为单位进行加减.(2).数组名是指针常量 ,不能改变其值 ,比如数组 a ,如果进行 a+;就会8/10个人精品文档,值得您的拥有报错(3). 虽然指针变量中存放的地址是整型数据,但不能将整型数据直接赋值给指针变量 ,应该这样 (假如 p 为 int * 型),p=(int *)1000; 但禁用些法 ,因为你不知道1000 这个单元有没有被其它单元占用,后果不可预料 ,同样也不能将一个指针变量的值直接赋给整形变量,也要进行强制类型转换 .(4)定义指针后 ,在使用之前一定要先给它

15、赋初值,切记(5).二维数组中指针问题 (int a3 4), 数组名a 是一个指向行的指针(指向数组 ),而在其前面加一个* ,*a 就是指向列的指针 (指向无素 ).a与* 都是指向 a00; 但 a+1(行指针 )指向 a10; 而*a+1( 列指针 ,和*(a+0)+1 一样 )却指向 a01; 同样在 a+1 前加一个 * 就又变成列指针了,*(a+1)+2 就指向 a12.(6),复杂类型的说明 :从变量名处起 ,根据运算符优先级结合,一步一步分析 ,下面以一个比较复杂的类型( int * (*p(int) ) 为例 :第一步 ,p 先与 ()结合 ,说明是一个函数 ,第二步 ,()内有一个 int,说明函数有

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论