完了,要重新学习C语言了。
- 数据类型:
整型:int(4个字节); 长整型:long int(8个字节); 短整型:short int(2个字节)
浮点数[实数】:单精度浮点数–float(4个字节) ;双精度浮点型–double(8个字节)
字符:单个字符 char (1个字节) 符号数据类型(结构体 枚举 共用体) - 代码规范:
定义变量;
对变量进行操作 ;
输出值;
(每部分都空格,每个功能模块直接空格) - 字节:
一个字节等于8位; - 运算符:
优先级:算术>关系>逻辑>赋值
下面是讲除法与取模运算的:
逻辑运算符里真假的处理。
C语言里对真假的处理:非零即为真,零是假;
eg:m=(3>2)&&(m=8)//输出就是m=1;
&&:这个运算符里的话,要是左边为假的话,右边就不会执行;
通过下面这段代码就很好理解了。
#include <stdio.h>
int main()
{
int i=10;
int k=20;
int m;
m=(3>2)&&(k=5);
printf("m=%d,k=%d\n",m,k);
return 0;
}
输出就是m=1;k=5,但是要是改成下面这样子。
#include <stdio.h>
int main()
{
int i=10;
int k=20;
int m;
m=(1>2)&&(k=5);
printf("m=%d,k=%d\n",m,k);
return 0;
}
输出就是m=1;k=20了。
或的话,如果前面是真,则后面的就不再执行;
- 流程控制:
顺序执行;选择执行;循环执行
- 选择:
if最简单的用法:
if(表达式)
语句
上面完成的功能就是如果表达式为真,则执行语句,如果为假,则不执行语句;
举个简单的例子:
# include <stdio.h>
int main(void)
{
if (3>2)
printf("AAAA\n");//会输出AAAA
if (3)
printf("bbbb\n");//会输出bbbb
if (0)
printf("CCCC\n");//不会输出CCCC
return 0;
}
这个可以和项目代码中的一些东西联系起来。
再看下面的一个代码:
include <stdio.h>
int main(void)
{
if (0)
printf("bbbb\n");//会输出bbbb
printf("CCCC\n");//不会输出CCCC
return 0;
}//结果是bbbb没有输出,但是CCCC会输出。
也就是说,if只能控制下面的一个语句!!!
也就是if的范围问题:
if(表达式)
语句A;
语句B
if默认只能控制A执行活着不执行,无法控制B的执行或者不执行。如果想要if同时控制A和B,则要把AB用大括号括起来。
if(表达式)
{
语句A;
语句B
}
同样的道理,
if(表达式)
语句A;
else
语句B;
语句C;
}//else也只能控制一个语句,不管if里面的语句是真还是假,C语句都会执行;
if else if else 的用法
if(表达式1)
语句A;
else if (表达式2)
语句B;
else if(表达式3)
语句C;
else(表达式4)
` 语句D;
//意思是如果表达式1成立的话,就执行语句A,如果表达式1不成立,表达式2成立,就执行语句B;如果表达式1,2都不成立,表达式3成立,就执行语句C;如果表达式1,2,3都不成立,则执行语句D。
对是三个数进行排序:
``# include <stdio.h>
int main(void)
{
int a, b, c; //等价于: int a; int b; int c;
int t;
printf("请输入三个整数(中间以空格分隔): ");
scanf("%d %d %d", &a, &b, &c);
//编写代码完成a是最大值 b是中间值 c是最小值
if (a < b)
{
t = a;
a = b;
b = t;
}
if (a < c)
{
t = a;
a = c;
c = t;
}
if (b < c)
{
t = b;
b = c;
c = t;
}
printf("%d %d %d\n", a, b, c);
return 0;
}
相当于先把ab进行比较,然后ac进行比较,最后bc进行比较。
- 循环:
分类:for;while;do while
基本的for的使用:
首先是执行语句1,并且1只执行一次;然后执行语句2,再执行语句4,最后执行语句3,语句3执行完了标志着一次循环的结束。然后再执行语句2进行判断,如果是真的话就再执行语句4,以此类推。
下面是一个for和if的嵌套使用,这个在实际工程中很常见。
/*
2009年10月21日15:51:16
求1到100之间所有的能被3整除的数字之和
*/
# include <stdio.h>
int main(void)
{
int i;
int sum = 0; // =0不能省
for (i=3; i<=100; ++i)
{
if (i%3 == 0)//如果 i能被3整除
sum = sum + i;
printf("sum = %d\n", sum);
}
return 0;
}
- 强制类型转换:
格式:
数据类型(表达式)
功能:把表达式里面的值强制转换成前面所执行的数据类型;
eg:int(4.2+2.5) 最后的结果是6
float(5) 最后的结果是5.0000
浮点数存在的问题:
float和double都不能保证可以精确的存储一个小数。
eg:如何判断一个浮点型变量是不是0,
if(|x-0.00000001|<0.000001)
是零;
else
不是零;
eg:
float i = 99.2;
printf("%lf\n", i);
最后输出的结果是:99.199997
- 自增自减
前自增 ++i ;后自增 i++
不同:
前自增整体表达式的值是i+1后的值,后自增整体表达式是i加1之前的值;
eg:
# include <stdio.h>
int main(void)
{
int i;
int j;
int k;
int m;
i = j = 3; //等价于 i = 3; j = 3;
k = i++;
m = ++j;
printf("i = %d, j = %d, k = %d, m = %d\n", i, j, k, m);
return 0;
}
/*
在Vc++6.0中的输出结果是:
----------------------
i = 4, j = 4, k = 3, m = 4
----------------------
总结:
前自增整体表达式的值是i加1之后的值
后自增整体表达式的值是i加1之前的值
*/
为什么要自增:
代码更精炼;自增的运算速度更快;
- 三目运算符
A?B:C
等价于
if(A)
B;
else
C;
- while
while(表达式)
语句;
for 和 while的相互转换:
for(1;2;3)
A;
等价于:
1;
while(2)
{
A;
3
}
- do while
do
{
........
}while(表达式);
do while并不等价于while,因为do while 一定会执行一次,而while可能一次都不执行;
do while主要用于人机交互;
下面是一个距离,说明人机交互。
include <stdio.h>
include <math.h>
int main(void)
{
double a, b, c;
double delta;
double x1, x2;
char ch;
do
{
printf("请输入一元二次方程的三个系数:\n");
printf("a = ");
scanf("%lf", &a);
printf("b = ");
scanf("%lf", &b);
printf("c = ");
scanf("%lf", &c);
delta = b*b - 4*a*c;
if (delta > 0)
{
x1 = (-b + sqrt(delta)) / (2*a);
x2 = (-b - sqrt(delta)) / (2*a);
printf("有两个解,x1 = %lf, x2 = %lf\n", x1, x2);
}
else if (0 == delta)
{
x1 = x2 = (-b) / (2*a);
printf("有唯一解,x1 = x2 = %lf\n", x1, x2);
}
else
{
printf("无实数解!\n");
}
printf("您想继续么(Y/N): ");
scanf(" %c", &ch); //%c前面必须得加一个空格 原因略
} while ('y'==ch || 'Y'==ch);//像这种判断类型的语句,尽量把常量放在前面,eg if (0==a)
return 0;
}
- switch
看下面一个example。
int main(void)
{
int val;
printf("请输入您要进入的楼层: ");
scanf("%d", &val);
switch (val)
{
case 1:
printf("1层开!\n");
break;
case 2:
printf("2层开!\n");
//break;
case 3:
printf("3层开!\n");
break;
default:
printf("没有盖到这一层!\n");
break;
}
return 0;
}`
switch的执行过程是这样的:
case 1,case 2,case 3…相当于入口一样,switch(val)里面的val相当于钥匙,当val为1的时候就从case 1这个入口进去,然后依次往下执行,遇到break就跳出来。也就是说上面的code如果都把break注释掉的话,如果val输入的是2,则相当于从case 2进去,然后下面的都会执行。
- break和continue:
break如果用在循环就表示终止循环;
break如果用在switch就表示终止switch;
brake不能直接用在if,除非if是循环中的一个子句;
{
if (3 > 2)
break; //break虽然是if内部的语句,但break终止的确是外部的for循环
printf("嘿嘿!\n");
}
在多层循环中,break只能终止距离它最近的循环;
在多层switch中,break也只能终止距离它最近的switch;
- continue:
用于跳过本次循环余下的语句,转去判断是否需要执行以下次循环;
for(1;2;3)
{
A;
B;
continue;//如果执行该语句,则执行完该语句,则会转去执行3,C和D会被跳过去,C和D不会被执行
C;
D;
}