一、 初识C语言
#include <stdio.h>int main(){
printf(“你好,C语言!\n”);
return 0;
}
这是一个最简单的程序, #include <stdio.h>是这个.c文件的头文件,”#”表示预处理命令,include的含义是”包含”,用来告诉编译器需要调用头文件,后面紧跟的<stdio.h>是头文件的名称为stdio.h(包含标准输入输出流的头文件),头文件名用<>括起来是提示编译器首先在系统目录中查找对应的头文件,除了<>还可以用””,用””是提示编译器首先在当前目录中查找对应的头文件。int main(){},这是主函数。当程序运行时main函数是起始函数,程序的起点。int为函数的返回值类型,括号中的内容为函数的参数,这里主函数没有参数,所以括号中没有内容,在自定义函数中如果需要参数则需要在括号中依次定义参数的类型和参数名(如:int pow_int(int a,int b){})。紧跟的{}中的内容为函数体,也是这个函数的块或者域,这是函数的主体,函数的过程都在函数体中实现。一个大括号中的内容表示一个域,在域中定义的自动变量只在本域中生效,当程序进程结束了这个域,这个域中定义的所有自动变量在内存中的空间都将或被释放。
printf(“你好,C语言!\n”);这是一个输出语句,printf()是一个包含于stdio.h头文件中的函数,它实现在控制台窗口中按规定格式打印一些内容,\n在printf中表示换行,而不是打印”\n”,如果确实需要打印”\n”应该写成printf(“你好,C语言!\\n”);。每一条语句需要用”;”结尾,表示这条语句的结束。
return 0;这是函数的返回值,表示当函数执行完后返回0。返回值类型在函数名前定义,如:int main(){}中的int便是main函数的返回值类型,当函数执行完成则需要返回一个int型的值。
二、 变量的数据类型
变量是程序运行的基石,在C语言中变量的基本类型包括字符型、整形、单精度浮点型、双精度浮点型、指针以及各基本类型对应的数组类型和复合数据类型的结构体还有空类型。基本数据类型如下:内存单位及进制:
1EB=1024TB,1TB=1024GB,1GB=1024MB,1MB=1024KB,1KB=1024B,1B=8Bps
每一个Bps存放一个二进制码(即0或1)
在编写程序的过程中,用变量类型+变量名进行定义,如定义一个变量名为a的整形变量(int a;),在定义时可以完成变量的初始化(int a=0;)。需要注意的是在声明指针类型变量时是不允许将常量或变量值直接赋值给指针变量的,而是需要使用&符号取当前已有变量或常量的地址,因为数组名等价于数组首元素的地址所以当给指针变量赋数组(结构体可以看做一种包含多个数据类型的数组)首地址是不用&符号。当给浮点型数据赋值整形数值时计算机可以自动转换而不会造成数值的失真,而如果将一个浮点型的数据赋值给整形变量则计算机会进行强制类型转换,浮点型数值的小数位将会被直接舍弃!
例如:int a=5/4;
printf(“a的值为:%d\n”,a);
则会显示:“a的值为:1”而不是1.25。
二进制码的计算(1字节内):
一个字节包含8个2进制空间(Bps)可以表示-128到127之间的数值。其中第一位为符号位,符号位为1则表示这是一个负数,为0则表示为正,后7位则这这个数的2进制绝对值。如:00001001表示+7;10001000表示-6;特殊的10000000表示-128(而不是-0)。
受计算机物理构造限制以及最大限度优化设计,运算器只能进行2进制加法运算,所以在计算机内部对2进制码还有反码和补码的处理过程。对于正数而言,它的反码和补码就是它本身,负数的反码为其符号位不变其余各位取反,负数的补码为在其反码的基础上加1。
三、 运算符
算数运算符:+、-、*、/、()、%、++、--关系运算符:==、>=、<=、>、<、!=
逻辑运算符:或||、且&&、非!
赋值运算符:=
优先级:一般顺序为算数运算符>关系运算符>逻辑运算符>赋值运算符,优先级最高的是! () sizeof() ++ -- 然后逻辑运算符中&&的优先级高于||
需要注意的是在算数运算符中的++和--,如果后置则是在整个运算式计算结束后再自加1或自减1,如果运算符前置则需要先自加1或自减1后再执行运算式。
例如(部分函数其它部分省略)
int num1=9;
int num2=10;
int sum_num=0;
sum_num=++num1+(++num1)-(num2--)-(--num2);
printf(“++num1+(++num1)-(num2--)-(--num2)的结果为:%d\n”,sum_num);
最后打印结果为“++num1+(++num1)-(num2--)-(--num2)的结果为:4”
计算步骤:
找出前置++或—的位置,并计算:
++num1;
++num1;
--num2;
执行后num1=11,num2=9,然后执行算式:num1+num1-num2-num2
=11+11-9-9
=4
然后将4赋值给sum_num,之后再计算后置的++和--:
num2--;
执行后num2=8;
特殊的:
int num1=9;
num1=num1++;//执行后num1的值为9。
int num1=9;
num1=++num1;//执行后num1的值为10。
自己给自己赋值会在内存在开辟出一个同名的变量,当前置++时会将num1拷贝一份然后将备份自加1然后再将已经备份的值复制回来,然后备份被释放。当后置++时也会将num1拷贝一份然后将备份自加1,但是因为赋值运算已经运算完成了,备份(同名变量)的10将不会被赋值回来,然后备份被释放,num1的值不变。
四、 选择结构
在C语言中选择语句包括if语句和switch语句,if语句用于条件判断适用于区间范围和点范围的判断,switch语句用于点范围的判断。语法结构如下:if(条件判断){
如果成立则执行这个代码块
}else if(条件判断) {
如果成立则执行这个代码块
}else if…根据情况使用else if 可以无限级联…
else{当之前定的判断都不满足时执行这个代码块}
if语句是条件判断语句,如果条件判断成立则执行,执行完成后不再进行后续的条件判断,如果条件不成立则跳到下一个else if 直到判断条件成立,如果都不成立则执行else后面的内容。if语句可无限嵌套和级联,除了必要的条件判断,语句中的else if 和else语句都可以省略,如:if(i>0){printf(“i>0”);}到此结束if语句。
case 对比的值1://如果对比值1与变量值不相等则直接跳到下一个case或default
代码;//当对比值1与变量值相等时执行这个代码
break;//退出这个switch语句,如果缺省break则继续判断下一个case
case 对比的值2:
代码;//当对比值2与变量值相等时执行这个代码
break;
…
default://执行到此语句则不需要任何条件判断,直接执行下面的代码,一般用于所有的条件都不匹配的情况。
代码;
}
switch语句只能用于点对点的条件判断,功能没有if语句全面,如果要用switch语句进行范围判断则需要将对比变量事先进行对应各个区间的条件赋值(这种方法费力不讨好,不建议使用)。
五、 循环结构
C语言中常用的循环结构包括while循环、do while循环以及for循环,while循环和do while循环用于条件判定循环,它们的区别是while循环一开始便需要进行条件判断,如果判定结果为假则不会执行循环体中的代码,而do while循环的第一次循环体语句的执行是不会进行条件判定的,只在第1次循环体语句结束后判定,如果条件判定为真则返回循环体开头位置再次执行,否者退出循环体,即do while循环在执行中至少被执行一次。for循环用于明确循环次数的循环,通常需要定义一个控制循环次数的变量。它们的结构如下:while(条件判断){//while循环先进行条件判断,如果成立则执行循环体中的代码
循环体;
}//每次循环体执行完毕跳回while循环开头,再次执行条件判断,如果判定为真则再次执行循环体,否则退出循环体
循环体;
}while(条件判断);//每次循环结束后进行条件判断,如果判定为真则再次执行循环体否则退出循环
循环体;
}//循环体执行完成跳到for循环开头,先执行括号中最后一个分号后的语句,然后条件判断