c语言容易忽略的点

来源:互联网 发布:网络直播发展的弊端 编辑:程序博客网 时间:2024/05/22 14:01
世间事,除了生死,哪一件不是闲事。        ------仓央嘉措

        在Linux环境下,gcc编译器由分析器、优化器、编译器组成。gcc执行分四步:
        1)预处理;执行预处理语句,删除注释(预先护理部分语句)gcc -E xx.c xx.i 
        2)编译;将C语言转化为汇编语言(检查C语言的语法正确性) gcc -s xx.i -o xx.s 
        3)汇编;将汇编语言转换成目标文件(二进制文件)  gcc -c xx.s -o xx.o      vim -b xx.o (:%!xxd -g 1)  查看二进制文件
       4)链接;确保多个目标文件组成的程序正常运行

 1、对于主函数的写法,主要有两种:
 第一种:
 int main(int argc,char  **args)
 {

 }
 这种写法是最初C语言主函数的写法。
第二种:
int main()
{

}
这种是简化了的写法,两种写法都可以,但是有许多学校的教学用的是:
void main()
{

}
这种写法不符合C语言的标准。

2、关于常量变量
实型常量有两种表示形式:

  1.小数形式。由数字和小数点组成,必须有小数点。

    例:4.23、0.15、.56、78.、0.0

  2.指数形式:以幂的形式表示,以字母e或E后跟一个以10为底的幂数。

  (1)字母e或E之前必须要有数字。

  (2)字母e或E后面的指数必须为整数,字母e或E的前后及数字之间不得有空格。

  默认是double,如果数字后面加上<f> <F> 就表示float 型,后缀“l”或“L”表示long double型。

  例:2.3e5   500e-2   .5E3    4.5e0   34.2  .5  12.56L  2.5E3L
sizeof(); 运算符 计量单位字节
int    4字节     32位1个符号位,范围:-2**31---2*31-1
float     4字节    小数点后6---7位
double     8字节     小数点15---16位
char     1     
不同操作系统可能会不同,可用运算符sizeof()来计量单位字节。
值得注意的是long int与short int,这两种变量类型的大小根据操作系统而定,唯一确定的是long型一定大于等于int型,short型一定小于int型。
在选择数据类型时,在都可以的情况下,尽量选择少的,因为将来如果用户非常多的时候,可能是几个字节的上亿次叠加。
unsigned作修饰符时,格式输出为%u,可以达到节省字符的目的,但使用时要确保不会用到负数。
另外,关于C语言有没有bool类型数据的问题,最初的89年版C语言是没有的,但是C语言隔一段时间就会更新一次,99年版增加里bool类型,但是现在大多数的编译器都还是只支持89年版。

3、关于格式输出
%.2f  保留小数点后两位(四舍五入)
10.2f  10表示整个位数(小数点也算,只有大于数据原宽度情况下才有用)
%10d  同样的,输出的位数占十位
另外,还有输出一些特殊符号:
1)\t   出现的地方相当于出现里tab键;
2)\r  换行;
3)\空格  代表空格;
4)\\  代表\;
5)\n   代表回车回车;
6)\"  代表";
7)\'   代表';
8)??   代表?;
9)%%   代表%

4)关于字符
大家都知道计算机存储字符是存储的ASCII码,说白了就是存的数字,不同数字代表不同字符,为了写程序的方便,最好能记住一些常用字符的ASCII码。(所有的单字符都用符号' ',字符串用“ ”)
A--Z  65 -- 90
a--z   97 -- 122
0--9   48 -- 57

5)关于类型转换
出现不同字节大小的变量类型进行运算的时候将会扩充占字节小多大的数据(自动类型转化)。
出现不同类型运算,但是两种类型占空间大小一致,将表示精度小的数据类型,转化为表示精度大的数据类型。
除了自动类型转换,有时需要人为的进行类型转换,称为强制类型转换。
例:(int)float 小数部分直接丢弃,不进行四舍五入

6)关于标准输入函数scanf()
用户在用键盘输入数据时,数据并不是直接到达计算机内存,而是要经过一个缓冲区。这就设计到一个缓冲区残余问题。
举个简单的例子:
#include <stdio.h>
int main()
{
       char ch ,get;
         scanf('%c',&ch);
         get=getchar();
         printf("%c %c",ch,get);
         return 0;
 }
代码的本意是输入两个字符并打印,但是运行时会发现,当你输完第一个字符,回车后,屏幕上就会输出你输入的第一个字符,然后换行。这是因为当输入第一个字符并回车后,字符被写入,但是回车(\n)留在里缓冲区,当遇到getchar时,被吸收了进去,如何没有遇到getchar,这个回车会一直存在于缓冲区,很容易引发程序出错。输入完成后回车,这是无法避免的,如何解决这个问题?首先,可以在每一个scanf()语句后面增加一句getchar();来吸收\n,但是,用户在输入的时候并不一定会按要求输入一个字符,可能是任意多个,这样的话缓冲区会残存许多字符,最常用的做法是在每一个scanf()后面增加一句while(getchar()!='\n');

7)关于运算符
c=b+a++;    相当于c=b+a;a++
a+++b;相当于(a++)+b;
c=a>b?a:b;(唯一的三目运算符)先判断a>bs是否成立,成立c取值于a,不成立取值于b。
运算符的运算方向:除了单目运算符和赋值运算符是从右向左,其余都是从左向右。
,(逗号运算符)取值为右边的值,但是左右的表达式都会运行,优先级最低。

8)关于程序书写
写程序首考虑1、稳定性;2、可读性;3、可维护性;4、性能
Linux系统编译程序时,它会报错误和警告,其中警告是分等级的,有些它认为不重要的警告使用gcc xxx.c 命令不会报,要用gcc xxx.c -Wall来查看,有些警告可能会造成输出结果的不理想。
在写if语句时,我们经常会写if(a==0),当代码非常长的时候,可能会写成if(a=0),此时括号里是赋值语句,为真,所以一定会执行if下的语句,不妨写成if(0==a),这时当写成if(0=a),程序就会报错。
例:for(i=0;i<18;i++)   一般判断的时候不写=,因为像float这种类型是不精确的,使用等号容易错过需要的数。

9)一些函数
程序运行时有时我们需要直接退出---exit(0);自然退出  exit(1);成功退出  exit(-1);失败退出
index = rand()%5;   //0--4随机取值
index =  rand()%91 + 10;  //90--100随机取值
srand((unsigned)time(NULL));//将时间设置为随机数种子,整个程序中只要有一次就好


10)最后
if switch不是函数,不属于任何库
for 适用于循环次数确定的场景
while  适用于循环次数不确定的场景
do while 总次数与while相同
contiune  结束当前一次循环
break  退出循环

QQ:1786610699      倔强的木木      2017年7月15日
原创粉丝点击