C语言基础
计算机程序:人编写的让计算机执行的操作,这些操作的集合称为程序
计算机语言:在计算机上编写的能够让计算机完成某项功能的语言,该语言可以通过编译器,转化为计算机能够识别的二进制指令。
一、计算机语言分类
机器语言
计算机能识别的由0和1组成的语言,不方便人查看
汇编语言
用标记符来代替机器指令用来编程的语言,运行速度块
高级语言
更加贴近与人类的语言来编程的语言,有单词连接
二、C程序结构
任何计算机执行c程序时,都是从程序的入口执行的,int main()就是程序的入口,而且一个程序中只有这么一个主函数
三、变量、标识符
1.变量的使用
变量初始化:在定义变量的同时进行赋值
赋值:先定义变量,后对变量进行赋值操作
二者的区别:只定义了变量而不进行赋值操作,那么这个变量的值是随机的数。但也有例外,全局变量和static修饰的变量等默认初始值就是0的情况
注:在变量初始化的时候不能多个变量连续赋值,例如
int a=b=10; //这种赋值是错误的
//正确赋值
int a,b,c;
a=b=c=10;
2. 标识符
-
以数字、字母、下划线组成,且开头不能是数字。
-
标识符不能和关键字重名
-
关键字在编写的时候有颜色区分,且在C语言中关键字都是小写
-
C语言中区分大小写
四、数据类型
数据类型转换
-
隐式类型转换(在不同数据类型变量进行运算过程中,计算机自动将低精度的数据类型转换为高精度数据类型参与运算,结果自然也是高精度数据类型),
-
显示类型转换(强制转换)
高精度数据类型转换为低数据类型
格式:(低精度数据类型) 高精度数据类型数据:
五、输入输出
1. 输出printf
printf格式化输出,按照指定格式进行输出
printf的输出格式:
//printf输出格式
printf("格式化字符串,其中包含占位符",输出变量名);
//占位符
%d:十进制整形
%ld:长整型
%f:单精度浮点型
%lf:双精度浮点型
%c:字符型
%s:字符串型
%o:八进制
%x:十六进制
%#x:十六进制默认在前面加上0x
%e:指数形式表示小数
%p:地址
二进制:0b开头
八进制:0开头
十六进制:0x开头
注:标识符不能和关键字重名,但是printf不是关键字,可以以printf为变量名,但是之后在使用printf功能进行输出的时候会报错,显示printf不是一个函数或者函数指针,所以一般不会用它当做标识符
2.输入scanf
1.格式:
scanf("占位符/格式化字符串",变量地址);
注:从标准输入(键盘)输入数据
2.从键盘上输入数据给变量接受并存储。
3 如果没有从键盘上输入数据,那么就阻塞等待,直到键盘输入数据才执行完该语句
4.当键盘输入的字符串,与 scanf 格式化输入进行匹配,如果格式化中有非占位符字符,那么从键盘输入的普通字符如果和格式化非占位符内容匹配,如果二者匹配,就直接匹配完,进行下一个格式化内容的匹配;遇到格式化占位符就表示键盘输入的字符串的当前位置需要和占位符进行匹配,如果匹配就将内容传给格式化占位符对应的变量,如果不匹配就说明scanf()匹配失败。
变量地址:&变量名
注意:如果是连续% d % d 整数,在输入时通过空格或回车来分开
空格回车不能用来分割字符% C ,因为%输入是字符,回车,空格都是字符
例如:
int age = 0;
float date = 0.0;
char buf[10] = {
0};
scanf("nihao%d%f%s",&age,&date,buf);
/*
这时从键盘上输入就必须是:nihao10 3.14good
表示将age赋值为10,date赋值为3.14,buf数组赋值为good
值的注意的是在输入3.14完之后,如果用空格或者回车,那么就会被当做buf的内容一并输入到bu数组中
*/
-
字符输入、输出:getchar、putchar
getchar():阻塞等待终端输入一个字符,整个功能就是输入一个字符
char ch; ch=getchar(); //表示从键盘中输入一个字符赋值给变量ch
putchar(字符):向终端输出一个字符
putchar('A');
gets()
从键盘上输入一个字符串
#include <stdio.h> int main() { char ch[100]; ch=gets(); printf("%s\n",ch); }
puts()
输出一个字符串
-
当程序正在运行时,通过 ctrl + c接受
六、gcc编译过程
预处理、编译、汇编、链接
七、转义字符
转义字符:\
将普通字符转为特殊字符:因为ASCII表中的一些特殊字符,不能用一个字符表示,所以用\加上字符来表示
此外也可以通过\将具有特殊意义的字符转化为普通字符,例如输出\就需要输入\\ ,输出“”就需要写成 \ " \ "
常见的特殊字符:
- ‘\a’:
- ‘\b’:
- ‘\f’:
- ‘\n’:
- ‘\v’:
- ‘\t’:
- ‘\0’:
- ‘\nn’:
- ‘\xnn’:
八、运算符
表达式:数据通过运算符进行关联的得到的式子
算数运算符
-
除法运算符:/
两个整数相除,结果一定只取的是整数部分
两个不同类型的数据相除,按照精度高的转换,结果也是高精度
-
求余数:%
一定是两个整数之间才可以求余数
自增、自减运算符
- 变量++:
- ++变量:
- 变量–:
- –变量:
关系运算符
连续使用多个关系运算符,在语法上不会报错,但是一般不会达到想要的结果
//想要变量x在30和50之间
如果连续用关系运算符
30<x<50; //这里只要x大于30永远为真,不能达到想要的结果
应该用
30<x && x<50;
表达式:由运算符连接的式子
逻辑运算符
- &&:一假为假
- ||:一真为真
- !:取反
三目运算符
语法:表达式?成立的表示式:不成立的表达式
问题:10右移3位,结果是
位运算符
计算机运算全部是二进制补码形式运算,在屏幕上显示的结果也是二进制取补码之后得到的
位运算符两边的数据正负都可
-
<<左移运算符:数据<<位数:表示二进制数据左移多少位,其中高位丢弃,低位补零。这种方法可能改变数据的正负特性。例如:12<<28,就变为了负数
而且,二进制每向左边移动一位,那么十进制数就乘以2
-
右移运算符: 数据> >位数:,如果是负数那么右移后高位补1,如果是正数,那么右移后高位补零。这种方法可能导致在不能被二整除的数据中出现精度缺失的问题,例如:5>>1,结果却是2,而不是2.5.
而且,二进制每向右边移动一位,那么十进制数就除以2
右移运算符可分为逻辑右移和算数右移:
逻辑右移:低位丢弃,高位补零
算数右移:低位丢弃,高位补符号位
-
位逻辑与&:数据1 & 数据2,这是按照数据的二进制补码的形式每一位进行匹对,只有对应为同时为1才为1,否者为0
-
位逻辑或 | :数据1 | 数据2,这是按照数据的二进制补码的形式每一位进行匹对,只有对应位有一位为1该位结果为1
-
位逻辑异或 ^:数据1 ^ 数据2,这是按照数据的二进制补码的形式每一位进行匹对,只有对应位不一样该位结果才为1
九、流程控制
流程控制:控制程序代码的运行方式,默认情况下是顺序执行。
1. 顺序结构
顺序结构就是程序按照语句编写的顺序进行执行。
2. 选择结构
(1)if选择结构
单分支、双分支、多分支
(2)switch选择结构
switch …case 结构
//表达式和每个常量表达式进行对比,如果成功,就执行对应语句
switch(表达式)
{
case 常量表达式1: //常量程序运行过程中不会改变的量
{
语句1;
语句2;
break;
}
case 常量表达式2:
{
语句1;
语句2;
break;
}
case 常量表达式3:
{
语句1;
语句2;
break;
}
default:
{
语句1;
语句2;
break;
}
}
注:每个case 语句执行完成之后,都必须加上break退出switch结构;如果不加就会导致执行完该case语句后,继续匹对下一个常量表达式,直到之后的所以case常量都匹对完才退出switch结构
注:switch比较判断,只能是整形或者字符型
3.循环结构
for循环
//for循环结构
for(表达式1; 表达式2;表达式3)
{
//语句块
}
//执行顺序:进入循环时,执行表达式1,之后执行表达式2,判断条件是否满足,满足条件则执行语句块,然后执行表达式3,实现循环条件的更新;之后执行表达式2,判断条件....
注:在for的括号中,可以不写表达式,但是,分号一定要写上
while循环
//while循环结构
while(循环控制语句) //先判断表达式是否成立,成立则执行循环体
{
//循环体
}
//int i=0;需要循环n次就while(i<n)
//其中,执行最后一次循环的时的i值为n-1;最后一次循环结束后i的值为n;
#include <stdio.h>
int main()
{
int i=0;
while(i<5)
{
printf("进行第%d次循环,此时i=%d,",i+1,i);
i++;
printf("该次循环结束,i=%d\n",i);
}
}
运行结果:
do while循环
//do while循环结构
do
{
//循环体
}while(循环控制语句); //这个分号必须写上
//此时的while判断条件为第二次开始,但是while条件判断任然是需要执行几次就是几次
#include <stdio.h>
int main()
{
int i=0;
do{
printf("这是第%d次循环\n",i