一、C语言是什么?
简单来说C 语言是一种通用的、面向过程式的计算机程序设计语言。1972 年,为了移植与开发 UNIX 操作系统,丹尼斯·里奇开发了C语言。C 语言是一种广泛使用的计算机语言,二者在现代软件程序员之间都得到广泛使用。
二、人生中的第一个C语言程序
在编写第一个程序之前,要注意程序的书写:你书写的C语言代码,文件以 .c 结尾 ,必须符合 C语言编译器的规则。
我的C语言第一个程序如下:
程序详解:
- 所有的 C 语言程序都需要包含 main() 函数。 代码从 main() 函数开始执行。
- /* ... */ 用于注释说明。
- printf() 用于格式化输出到屏幕。printf() 函数在 "stdio.h" 头文件中声明。
- stdio.h 是一个头文件 (标准输入输出头文件) , #include 是一个预处理命令,用来引入头文件。 当编译器遇到 printf() 函数时,如果没有找到 stdio.h 头文件,会发生编译错误。
- return 0; 语句用于表示退出程序。
三.C语言的数据类型
3.1常量数据
3.1.1整形常量
整形常量指的是整数,整数在c语言中,有三种表示方式:
1.十进制表示 ----- 用0,1,2,3,4,5,6,7,8,9这10个数字表示的数,例如:12,21,45,250
2.八进制表示 ----- 用0,1,2,3,4,5,6,7这8个数字表示的数,例如: 012 , 021 , 045
3.十六进制表示 ---- 用0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F这16个数字表示的数,0x12,0x21,0x45
3.1.2浮点型常量
浮点型常量有两种表示方式:
第一种:浮点表示
例如: 3.14 2.34 5.67
第二种:e技术表示
例如: 2.34E2 3.14e-2
3.1.3字符型常量
字符型常量,表示一个字符,一般用单引号''括起来
例如:
可见字符: 'a' 'F' 'X'
不可见字符: '\a' '\n'
不可见字符还可以用编码表示: '\007' 7 '\x07' '\a'
3.1.4字符串型常量
字符串指的是多个字符的组合,多个字符连在一起就是一个字符串,在C语言中,字符串用双引号""括起来。
例如:
"hello world" "abc" "张三" "peter" "a"。
字符串在计算机中存储时,按每个字符的ASCII存放,在最后一个字符后自动添加一个字符串结束标志 '\0'。
3.1.4字符串型常量
使用#define 定义的符号,用于表示一些常量,把这样的符号 称为符号常量
例如:
#define PI 3.14
3.2变量数据
变量必须先定义,然后才能使用,在定义变量时,计算机会给变量分配内存空间,在程序中就可以给变量中存放不同的数据,改变变量的值。
变量需要先定义后使用,如何定义变量,在C语言中,给不同类型规定了一个关键字,可以用关键字来定义不同类型的变量。
3.2.1整型变量
以int为例介绍
1.定义
int a; //定义一个变量a
int b,c; //同时定义多个变量,之间用逗号隔开
2.初始化 -----在定义的同时赋值
int a = 10; //定义变量a,同时往a中保存10
int b = 3,c = 5; //定义多个变量,同时保存3,5
3.赋值
a = 120; //向a的空间中存放120
b = a; //将a中的值拷贝给b
c = a + 10; //将a和10相加的结果保存到c中
#include<stdio.h>
int main(void)
{
//定义变量
int a;
int b,c;
//初始化
int d = 3,e = 5;
a = 120;
b = a;
c = a + 10;
printf("a = %d\n",a);
printf("b = %d\n",b);
printf("c = %d\n",c);
printf("d = %d\n",d);
printf("e = %d\n",e);
return 0;
}
3.2.2浮点型变量
以float为例
1.定义
float a; //定义一个变量a
float b,c; //同时定义多个变量,之间用逗号隔开
2.初始化 -----在定义的同时赋值
float a = 1.20; //定义变量a,同时往a中保存10
float b = 3,c = 5; //定义多个变量,同时保存3,5
3.赋值
a = 12.340; //向a的空间中存放120
b = a; //将a中的值拷贝给b
c = a + 10.32; //将a和10相加的结果保存到c中
#include<stdio.h>
int main(void)
{
//定义变量
float a;
float b,c;
//初始化
float d = 3.2,e = 5.7;
a = 12.340;
b = a;
c = a + 10.56;
printf("a = %f\n",a);
printf("b = %f\n",b);
printf("c = %f\n",c);
printf("d = %f\n",d);
printf("e = %f\n",e);
return 0;
}
3.2.2布尔型变量
表示真假类型
在程序中:非零即真(非零的值都默认为真) ,也可以用true表示真,用false表示假
对于计算机来说,用0表示假,用1表示真
#include <stdio.h>
#include <stdbool.h>
int main(void)
{
bool b;
b = 110;
printf("b = %d\n",b); //b = 1
b = -9;
printf("b = %d\n",b); //b = 1
b = false;
printf("b = %d\n",b); //b = 0
b = true;
printf("b = %d\n",b); //b = 1
b = 0;
printf("b = %d\n",b); //b = 0
return 0;
}
四、数据类型转换
4.1 隐式转换
隐式转换:由系统自动转换,是一种默认的类型转换方式。
char ---> short ----> int ---> long ---> long long ---> float ---> double ---->long double
4.2 强制类型转换
需要在程序中,通过语法来转换,语法格式如下:
(要转换的类型)数据
char <--- short <---- int <--- long <--- long long <--- float <--- double <----long double
#include<stdio.h>
int main(void)
{
int a = 12,b;
float c = 4.5,d;
b = a + c;
printf("b = %d\n",b);
d = a + c; //隐式转换
printf("d = %f\n",d);
d = a + (int)c; //强制类型转换
printf("d = %f\n",d);
return 0;
}
五,字符串和格式化IO
5.1字符串
按字符顺序,存储每一个字符的ASCII值,在最后一个字符的后面自动添加'\0'作为字符串的结束标志。
5.2格式化IO
5.2.1格式化输出函数printf()
转换说明符种类:
转换类型 说明
%d 有符号十进制整数
%o 无符号八进制整数
%u 无符号十进制整数
%x 无符号十六进制整数
%c 一个字符
%s 字符串
%f 十进制计数法的浮点数
%e E-计数法的浮点数
%p 指针
#include <stdio.h>
int main(void)
{
printf("hello\n");
printf("%d,%f\n",120,3.45);
printf("%o\n",0123);
printf("%x\n",0x23);
printf("%u\n",120);
printf("%c\n",'Y');
printf("%s\n","hello");
printf("%f\n",234.567);
printf("%e\n",234.567);
return 0;
}
5.2.3格式化输入函数scanf()
1,转换说明符个数必须和变参中的参数个数相同
2,转换说明符必须和对象的参数类型一致
3,输入时,变参必须是内存空间地址
4,输入float类型数据,用%f,输入double类型数据时,用%lf
5,如果输入多个数据时,可以使用空白符隔开,(空白符:空格,tab制表符,换行符)
6,%可以接收任何一个字符,所以如果格式控制串中有%c,前面的参数和输入的字符之间不能有空白符
7,scanf返回值表示正确接收参数的个数,当scanf在接收参数时,如果遇到错误,则会停止接收后面的数据
六、运算符,表达式和语句
6.1赋值运算符 =
左值:赋值号左边的数据称为左值,左值必须是变量,表示变量的内存空间
右值:赋值号左边的数据称为右值,右值可以是变量、常量、表达式,地址等,表示一个具体的数值
#include<stdio.h>
int main(void)
{
int a,b,c;
a=10;
b=20;
c=a+b;
printf("%d+%d=%d\n",a,b,c);
return 0;
}
6.2算术运算 + - * / % ++ --
++和--- 只能用于变量中的数值计算,表示某个变量的值自加1或自减1
例如:
int a = 3,b = 5;
a++; //取出a的值,给它加1,然后再把结果保存到a中
b = ++a - 2; //先对a自加1,然后取出a的值运算
b = a++ - 2; //先取出a的值运算,运算结束后,再对a自加1
6.3逻辑运算 ! && ||
逻辑取反 ! 表示把真变成假,把假变成真
逻辑与 && 运算结果入下表(真值表)
表达式1 && 表达式2 结果
-----------------------------
真 真 真
真 假 假
假 真 假 //断路运算:当表达式1为假时,则表达式2不执行
假 假 假
逻辑或 || 运算结果入下表(真值表)
表达式1 || 表达式2 结果
-----------------------------
假 假 假
假 真 真
真 真 真 //断路运算:当表达式1为真时,则表达式2不执行
真 假 真
6.4逻辑运算 ! && ||
对数据按二进制每一个进行逻辑运算,1 - 真,0 --假
例如:
char a = 5, b = 3;
1.按位取反 ~
~a ---- -6
2.按位与
a & b --- 1
3.按位或
a | b --- 7
4.按位异或 ---相同为0,不同为1
a ^ b ---- 6
5.左移位 -----在右边补0
a << 2 ---- 20
6.右移位 ----在左边:正数补0,负数补1
a >> 2 ---- 1
-a >> 2 --- -2
6.5关系运算 > >= < <= == !=
比较大小,运算结果都是逻辑真假值
例如:
int a = 5, b = 3;
a > b 真
a < b 假
a == b 假
a != b 真
a = b 真
6.6复合运算 += *= |= &= 等
将赋值运算和 算术,位运算合并使用
例如:
int a = 5, b = 3;
a = a + b; ----> a += b;
a = a & b; ---- a &= b;
6.7条件运算 ? :
三目运算符,有三个表达式参与运算
例如:
int a = 5,b = 3,c;
c = (a > b ? a : b); //先判断a>b,如果a比b大,则结果为a,否则,结果为b
6.8逗号运算 ,
可以对多个表达式使用逗号运算符,运算结果取最右边表达式的结果
例如:
int a = 5,b = 3,c;
a=12,b=34,c = a+b,a+b+c
6.9siezof运算
sizeof可以计算数据占用内存的大小,也可以计算数据类型的长度
七、控制流
控制流:指的是用于控制程序执行流程的一些特殊的语句,称为控制流语句,简称控制流。控制流按功能分为三类:
1.循环控制流
2.分支控制流
3.跳转控制流
7.1循环控制
7.1.1while语句
语法格式:
while(条件){ //条件-逻辑值,当条件为真,计算机就会执行一次循环语句块,条件为假,则退出循环
循环语句块
}
#include<stdio.h>
#include <stdbool.h>
int main(void)
{
int i = 0;
/*
while(i < 20){ //通过条件控制循环次数
printf("我是大帅哥!\n");
i++;
}
*/
//while(1){ //条件一直为真,则成为死循环
while(true){ //条件一直为真,则成为死循环
printf("我是大帅哥!\n");
}
return 0;
}
7.1.2 do while语句
语法格式:
do{
循环语句块;
}while(条件); //先执行循环语句块,然后判断条件,如果条件为真,则再执行一次语句块,然后判断,不断重复,如果条件为假,则退出循环
ps:其实用法跟while差不多只是虽然他的判断条件为假但是他还是会执行里面的语句一次。
7.1.3 for语句
语法格式:
for(表达式1 ; 表达式2 ; 表达式3){
循环语句块;
}
#include<stdio.h>
int main(void)
{
int i;
for(i = 0;i < 10;i++){ //通过条件控制循环次数
printf("我是大帅哥!\n");
}
return 0;
}
7.1.5 循环嵌套
循环语句块中又有循环语句,则成为循环的嵌套
7.2分支控制
7.2.1 if语句
语法格式:
if(条件){ //条件为真,则执行,条件为假,则不执行
条件语句块;
}
7.2.2 if-else语句
语法格式:
if(条件){ //如果条件为真,则执行代码块1,否则,执行代码块2
代码块1;
}else{
代码块2;
}
7.2.3 if-else语句
语法格式:
switch(整数){ //取出整数的值,和case后的常量比较,如果相等,则从该case下的语句执行,直到结束,如果不相
case 整型常量: //等,则和下一个case后的常量比较,如果相等,则从该case下的语句执行,直到结束,以此类推
语句块;
case 整型常量:
语句块;
....
case 整型常量:
语句块;
default: //可选的
语句块;
}
#include<stdio.h>
int main(void)
{
int day;
printf("pls input day:");
scanf("%d",&day);
switch(day){
case 1:
printf("今天是星期一!\n");
case 2:
printf("今天是星期二!\n");
case 3:
printf("今天是星期三!\n");
case 4:
printf("今天是星期四!\n");
case 5:
printf("今天是星期五!\n");
case 6:
printf("今天是星期六!\n");
case 7:
printf("今天是星期天!\n");
default:
printf("输入数据错误!!\n");
}
return 0;
}
7.3跳转控制
7.3.1 continue语句
只能用于循环语句中,表示结束一次循环执行, 进入到下一次的循环
#include<stdio.h>
int main(void)
{
int i;
for(i = 0; i < 100; i++){
if( i % 2 == 0)
continue;
printf("%d\n",i);
}
return 0;
}
7.3.2 break语句
可以用于循环语句中,表示跳出循环,如果是嵌套循环,只能跳出层循环
#include<stdio.h>
int main(void)
{
int i,j;
for(i = 0 ; i < 5; i++){
for(j = 0; j < 5; j++){
if(j >i)
break;
printf("* ");
}
printf("\n");
}
return 0;
}
7.3.3 break语句
goto语句---无条件跳转
跳转到标签指定的位置,继续执行程序,标签--自定义,不要和关键字冲突
八、函数
函数:对一段具有某个功能的代码封装。编写一个函数就是封装一段代码
封装的目的为了使得这段代码可以重复的被使用
语法格式:
返回值类型 函数名(参数列表) //函数头
{
代码块 ---- 函数体
}
8.1函数调用的几种方式
8.1.1没有参数有返回值
#include <stdio.h>
int fun1(void)
{
int a;
printf("请输入一个整数:");
scanf("%d",&a);
return a;
}
int main(void)
{
int a,b,c;
a = fun1();
printf("a = %d\n",a);
b = fun1();
printf("b = %d\n",b);
c = fun1();
printf("c = %d\n",c);
printf("%d\n",fun1());
return 0;
}
8.1.2没有参数有返回值
#include <stdio.h>
void fun(int a,int b)
{
printf("a = %d\n",a);
printf("b = %d\n",b);
}
int main(void)
{
fun(10,20);
fun(20,30);
fun(12,50);
fun(15,21);
return 0;
}
8.1.3没有参数和返回值
void fun(void)
{
printf("Hello,world\n");
}
int main(void)
{
fun();
return 0;
}
8.2函数的传参方式
两种传参方式:赋值传递和地址传递
1.赋值传递--传:常量,变量的值,表达式,地址量
#include <stdio.h>
void fun1(int a)
{
printf("%d\n",a);
}
int main(void)
{
int x = 120;
//赋值传递 -----在被调用的函数中只能使用传递的值,无法改变值
fun1(240); //传常量
fun1(x); //传变量的值
fun1(10+34); //表达式的运算结果
return 0;
}
2》地址传递--传:变量的地址
void fun2(int *a) //函数头中定义的变量称为形式参数,简称形参
{
printf("*a = %d\n",*a);
*a = 250;
}
int main(void)
{
int x = 120;
fun2(&x); //地址传递 ---传递变量的地址,在被调用函数中,可以修改变量的值 , 在调用中传递的变量称为实际参数,简称实参
printf("x = %d\n",x);
return 0;
}
九、结构体
概念:结构体(structure)是由各种类型组成的的复合数据类型,不同类型数据的封装,这些数据称为结构体的成员。
结构体类型属于自定义类型,在使用结构体时,需要先定义结构体类型,然后才能定义结构体变量。
9.1结构体类型定义格式
语法格式:
struct 结构体标签{
成员类型 成员名;
成员类型 成员名;
.... ...
成员类型 成员名;
};
#include<stdio.h>
int main(void){
struct person{
char name[30];
int age;
float height;
};
return 0;
}
9.2结构体变量定义格式
结构体变量定义格式有三种:
1.常规定义
struct person{
char name[30];
int age;
float height;
};
struct person p1; //p1为结构体变量
2.与类型同时定义
struct person{
char name[30];
int age;
float height;
}p2; //p2为结构体变量
3.直接定义
struct {
char name[30];
int age;
float height;
}p3; //p3为结构体变量
9.3结构体变量的初始化
1.完全初始化
struct person p1 = {"peter",21,1.87};
2.部分初始化
struct person p2 = {"jack",23};
3.指定成员初始化
struct person p3 = {.age=18,.name="rose"};
9.4结构体变量赋值
除了初始化之外,结构体变量不能整体赋值
1.可以分别给结构体每一个成员赋值
struct person p1;
strcpy(p1.name,"jack");
p1.age = 19;
p1.height = 1.66;
2.同类型结构体可以相互赋值
struct person p2;
p2 = p1;
9.5 结构体变量的取值打印
结构体变量不能整体打印,只能分别打印每一个成员,同时注意取结构体里面的成员要用 .
来找到。
#include <stdio.h>
#include <string.h>
int main(void)
{
//结构体变量定义
struct person p1;
struct person p2;
//结构体变量赋值
strcpy(p1.name,"jack");
p1.age = 19;
p1.height = 1.66;
printf("%s %d %.2f\n",p1.name,p1.age,p1.height);
return 0;
}
十、数组
概念:
数组是相同类型数据的集合(复合数据类型)。把这些相同类型的数据称为数组的元素。
数组分为三类:
一维数组 ------相同类型变量的集合
多维数组 ------相同类型数组的集合
变长数组 ------元素个数用变量来指定的数组
10.1
一维数组定义
语法格式:
元素类型 数组名[元素个数];
例如: int a[5]; //定义数组a,元素分别是a[0],a[1],a[2],a[3],a[4];
10.2 一维数组赋值
一维数组中的元素为变量,这些变量可以单独使用,这些元素的表示方式:数组名[下标]
因为数组元素的下标是连续的,所以在赋值的时候,可以使用循环语句赋值,例如:
int arr[5];
int i;
for(i = 0; i < 5; i++)
arr[i] = 10 * (i+1);
或者
printf("请输入数组元素:");
for(i = 0; i < 5; i++)
scanf("%d",&arr[i]);
10.3 一维数组取值打印
打印时,也可以使用循环的方式打印每一个元素,例如
for(i = 0; i < 5; i++)
printf("%d\n",arr[i]);
10.4 一维数组初始化
在定义数组的同时,给数组元素赋值,称为数组的初始化。
1.完全初始化 ---给每一个元素都赋值
例如:
int a[5] = {10,11,12,13,14};
int a[] = {10,11,12,13,14}; //完全初始化元素个数可以省略
2.部分初始化 ---给前若干个元素赋值
例如:
int a[5] = {10,11,12};
3.指定元素初始化 ----给特定的元素赋值
例如:
int a[5] = {[2]=12,13,[1]=11,[2]=20};
十一、全局变量
1.概念
全局变量---在所有函数外定义的变量。
2.全局变量的使用
1,全局变量可以被所有(多个)函数使用
2,如果某个函数中定义了同名的局部变量,则在该函数中就不能再使用同名的全局变量
总结
好啦,以上就是入门c语言的基本内容了,其实学完上面的内容想必大家也对c语言有了一个比较健全的认知,当然c语言的内容可不止这么一点点,这只是一些比较基础的入门级知识,后续还有指针,联合体,枚举,指针函数,函数指针,二维数组等等,本人比较懒,暂时先写这么多。