绪论
- 机器语言
- 汇编语言
- 第三代编程语言:c语言
C语言的特点:
- 效率高
- 灵活度高
- 可移植性高
第一个程序:
# include <stdio.h>
int main(){
printf("Hello World \n");
return 0;
}
printf:格式化输出函数
转义字符
变量和常量
变量名:
- 只能是英语字母和数字或者下划线组成
- 第一个字母必须是字母或者下划线
- 区分大小写
- 不能用关键字命名
关键字:
数据类型:
常量:
定义符号常量:
标识符
字符串常量:
\0 :空字符,在c语言里表示字符串的结束位置
数据类型
基本类型
sizeof运算符:
sizeof运算符用于获得数据类型或表达式的长度
sizeof(object);//sizeof(对象);
sizeof(type_name);//sizeof(类型);
sizeof object;//sizeof对象;
#include <stdio.h>
int main() {
printf("int = %d\n",sizeof(int));//4
printf("short int = %d\n",sizeof(short));//2
printf("long int = %d\n",sizeof(long));//4
printf("long long int = %d\n",sizeof(long long));//8
printf("char = %d\n",sizeof(char));//1
printf("bool = %d\n",sizeof(_Bool));//1
printf("float = %d\n",sizeof(float));//4
printf("double = %d\n",sizeof(double));//8
printf("long double = %d\n",sizeof(long double));//12
}
signed 和 unsigned
#include <stdio.h>
int main(){
short i;
unsigned short j;
printf("%d\n",i);//-1
printf("%d\n",j);//65535
return 0;
}
取值范围
比特位
CPU能读懂的最小单位 ----- 比特位,bit,b
字节
内存机构的最小寻址单位-----字节,Byte,B
1B=8b
符号位
- 存放singned类型的存储单元中,左边第一位表示符号位。如果该位为0,表示该整数是一个正数;如果该位为1,表示该整数是一个负数
- 一个32位的整型变量,除去左边第一位符号位,剩下表示值的只有31个比特位
- 事实上计算机是用补码的形式来存放整数的值
基本数据类型的取值范围
字符和字符串
字符串:
char 变量名[数量];
变量名[索引号] = 字符;
//声明字符串
char name[5];
//给字符串赋值:
name[0] = 'F';
name[1] = 'i';
name[2] = 's';
name[3] = 'h';
name[4] = 'c';
//定义字符串
char name[5] = {'F','i','s','h','c'};
printf("\s\n",name);
printf("Hello\n"); // 会出现乱码,因为name5个空间已经填满了,没有结束标志\0的位置了
//给\0留一个位置
char name[6] = {'F','i','s','h','c','\0'};
//上述太麻烦需要计算,可以如下定义
char a[] = {'F','i','s','h','c'};
char a[] = {"Fishc"};
char a[] = "Fishc";
运算符
算术运算符
目?
双目运算符:
单目运算符: 正负号
表达式
#include <stdio.h>
#include <math.h>
int main(){
int i,j,k;
i = 1+2; //3
j = 1+2*3; //7
k = i+j+-1+pow(2,3); // 17
printf("i=%d\n",i);
printf("j=%d\n",j);
printf("k=%d\n",k);
return 0;
}
类型转换
#include <stdio.h>
int main() {
// 1+2.0 == 1.0+2.0 ?
printf("整型输出:%d\n",1+2.0); //0
printf("浮点型输出:%f\n",1.0+2.0); //3.000000
//强制转换
printf("整型输出:%d\n",1+(int)2.0); //3
printf("整型输出:%d\n",1+(int)1.8); //2
printf("整型输出:%d\n",1+(int)(1+0.8)); //2
}
分支结构
关系运算符
关系表达式
- 用关系运算符将两边的变量、数据或表达式连接起来,称之为关系表达式:
1<2 //1
a>b //1
a<=1+b //0
‘a’ +‘b’ <= ‘c’ //0
(a=3) >(b=5) //0
1 — true
0 — false
逻辑运算符
- 用逻辑运算符将两边的变量、数据或表达式连接起来,称之为逻辑表达式:
#include <stdio.h>
int main() {
int a = 3;
int b = 5;
printf("%d\n",3>1&&1<2);//1
//任何非0的数为真!
printf("%d\n",3+1||2==0);//1
printf("%d\n",!(a+b));
printf("%d\n",!0+1<1||!(3+4));//0
printf("%d\n",'a'-'b'&&'c'); //1
}
短路求值
- 短路求值又称最小化求值,是一种逻辑运算符
的求值策略。只有当第一个运算数的值无法确定逻辑运算的结果时,才对第二个运算数进行求值。 - C语言对于逻辑与和逻辑或采用短路求值的方式
#include <stdio.h>
int main() {
int a = 3,b = 3;
(a=0) && (b=5);
printf("a=%d,b=%d\n",a,b); //a=0.b=3
(a=1) || (b=5);
printf("a=%d,b=%d\n",a,b); //a=1.b=3
return 0;
}
if语句
- 样式1
#include <stdio.h>
int main() {
int i;
printf("您老贵庚啊:");
scanf("%d",&i);
if(i>=18) {
printf("进门左拐");
}
}
- 样式2
#include <stdio.h>
int main() {
int i;
printf("您老贵庚啊:");
scanf("%d",&i);
if(i>=18) {
printf("进门左拐");
} else {
printf("慢走,不送");
}
}
- 样式3
#include <stdio.h>
int main() {
int scores;
printf("请输入你的分数:%c\n");
scanf("%d",&scores);
if(scores>=90) {
printf("A\n");
} else if(scores<90 && scores>=80) {
printf("B\n");
} else if(scores<80 && scores>=70) {
printf("C\n");
} else if(scores<70 && scores>=60) {
printf("D\n");
} else {
printf("E\n");
}
}
switch语句
#include <stdio.h>
int main() {
char ch;
printf("请输入成绩:");
scanf("%c",&ch);
switch(ch) {
case 'A':printf("你的成绩在90分以上!\n");
break;
case 'B':printf("你的成绩在80-90分之间");
break;
case 'C':printf("你的成绩在70-80分之间");
break;
case 'D':printf("你的成绩在60-70分之间");
break;
case 'E':printf("你的成绩在60分以下");
break;
default:printf("请输入有效的成绩评级");
break;
}
}
分支语句的嵌套
#include <stdio.h>
int main(){
int a,b;
printf("请输入两个数:");
scanf("%d %d",a,b);
if(a!=b){
if(a>b) {
printf("%d > %d",a,b);
} else {
printf("%d < %d",a,b);
}
} else {
printf("%d = %d",a,b);
}
}
- 悬挂else的问题
if后面都带大括号,如果没有大括号,else会跟离他近的if相搭配 - 等于号带来的问题
== 判断是否相等
= 赋值号
循环结构
while语句
#include <stdio.h>
int main() {
int i=1,sum=0;
while(i<=100) {
sum+=i;
i+=1;
}
printf("结果是:%d\n",sum);
return 0;
}
- getchar()
do…while语句
for语句
循环的基本结构
- 初始化计数器
- 循环条件
- 更新计数器
循环嵌套
应用:打印九九乘法表
#include <stdio.h>
int main() {
for (int i=1;i<=9;i++) {
for(int j=1;j<=i;j++) {
printf("%d*%d=%2d ",i,j,i*j);
}
putchar('\n');
}
return 0;
}
break 和 continue
1.当它们用在循环语句的循环体时,break用于立即退出本层循环,而continue仅仅结束本次循环(本次循环体内不执continue语句后的其它语句,但下一次循环还会继续执行。
2. 如果有多层循环时,break只会跳出本层循环,不会跳出其他层的循环.
3. break可用于switch语句,表示跳出整个switch语句块,而continue则不能单独的用于switch语句。但是continue可以用于循环内部的switch语句。
4. break和continue语句在循环内的switch语句中使用时,是有区别的。在这种情况下的break是指跳出switch语句块(switch语句块的代码仍然执行)。而这种情况下的continue是指结束本次循环(不在执行switch后面的代码),进行下一次循环。
运算符
赋值运算符
赋值运算符的左边必须是一个lvalue,变量名就是lvalue
eg:int a; a = 5;
复合的赋值运算符
a = a+1; ==> a++ ;
自增自减运算符
#include <stdio.h>
int main() {
int i=5,j;
j=++i;
printf("i=%d,j=%d\n",i,j); //i=6,j=6;
i = 5;
j = i++;
printf("i=%d,j=%d\n",i,j);//i=6;j=5;
return 0;
}
逗号运算符
- 语法:表达式1,表达式2,… ,表达式n
- 逗号表达式的运算过程为从左往右逐个计算表达式
- 逗号表达式作为一个整体,它的值为最后一个表达式(也即表达式n)的值
条件运算符
goto语句
- 语法:goto 标签;
- 开发过程中,尽量避免使用goto语句
#include <stdio.h>
int main() {
int i = 5;
while(i++) {
if(i>10) {
goto A
}
}
A: printf("Here,i=%d\n",i); // i=11
return 0;
}
注释
- // 单行注释
- /*
多行注释
*/