什么是C语言?
C语言是一门计算机语言
什么是计算机语言?
人和计算机交流的语言
C/C++/JAVA/python
语言的发展
二进制语言
硬件 - 电 - 正电1/负电0
手册 - 助记符(汇编语言)- B语言 - C语言、C++语言(高级语言)
C语言->早期不是很成熟->成熟->流行
国际标准ANSI C - C89/C90
C99/C11并不流行 - 不少编译器不支持
第一个C语言程序
1.创建工程(新建项目C++空项目)
2.添加源文件(视图-解决方案管理器)
.c - 源文件
.h - 头文件head
3.写代码
//包含一个叫stdio.h的文件
//std-标准standard input output
#include
//int是整型的意思
//main前面的int表示main函数调用返回一个整型值
int main()//主函数-程序的入口-main函数有且仅有一个
{
//这里完成任务
//在屏幕上输出hello world
//函数-print function-printf-打印函数
//库函数-C语言本身提供给我们使用的函数
//别人的东西-打招呼-#include
printf(“hello world\n”);
return 0;//返回0(整数)
}
数据类型
%d - 打印整型
%c - 打印字符
%f - 打印浮点数字-打小数
%p - 以地址的形式打印
%x - 打印16进制数字
char//字符数据类型 - 1byte
short int//短整型 - 2byte
int//整型 - 4byte
long//长整型 - 4/8byte(取决于平台)
long long//更长的整型 - 8byte
float//单精度浮点数 - 4byte
double//双精度浮点数 - 8byte
计算机中的单位
bit - 比特位(存一个二进制位1/0)
byte - 字节(1byte=8bit)
kb(1kb=1024byte)
mb(1mb=1024kb)
gb(1gb=1024mb)
tb(1tb=1024gb)
pb(1pb=1024tb)
#include
int main()
{
char ch = ’A’;//内存
printf(“%c\n”,ch);//%c-打印字符格式的数据
}
#include
int main()
{
int age = 20;
printf(“%d\n”,age);//%d-打印整型十进制数据
}
变量
定义变量:类型+变量名=内容,int age = 20;
全局变量 - 定义在代码块{}之外的变量
局部变量 - 定义在代码块{}内部的变量
当局部变量和局部变量的名字相同时,局部变量优先
#define _CRT_SECURE_NO_WARNINGS 1
//加在源文件的第一行
//运行“不安全”的函数,如scanf等
#include
int main()
{
int num1 = 0;
int num2 = 0;
int sum = 0;
//C语言语法规定,变量要定义在当前代码块的最前面,否则报错
//输入数据-使用输入函数scanf
scanf(“%d%d”,&num1,&num2);//取地址符号%
sum = num1 + num2;
printf(“sum = %d\n”,sum);
return 0;
}
变量的作用域和生命周期
作用域:这个变量哪里可以用,哪里就是它的作用域
局部变量的作用域是变量所在的局部范围
全局变量的作用域是整个工程
int main()
{
//g_val是另一个源文件里的全局变量
//需要声明extern外部符号
extern int g_val;
printf(“g_val = %d\n”,g_val);
return 0;
}
生命周期:变量的创建到销毁之间的一个时间段
局部变量的生命周期,是进入作用域生命周期开始,出作用域生命周期结束
全局变量的生命周期,是整个程序的生命周期
常量
1.字面常量
int main()
{
4;//字面常量,就是一个值
return 0;
}
2.const修饰的常变量
int main()
{
const int num = 4;//const修饰的常变量
//num是变量(一些需要用常量的函数不能用,如arr[num]会报错)
//num具有常属性(num的值不能改了)
}
3.#define定义的标识符常量
#define MAX 10
//#define 定义的标识符常量
int main()
{
int arr[MAX] = {0};//放在一些需要常量的函数内是可行的
return 0;
}
4.枚举常量
//枚举关键词-enum
//MALE,FEMALE,SECRET-枚举常量
#include
enum Sex
{
MALE,
FEMALE,
SECRET
}
int main()
{
enum Sex s = MALE;
printf("%d\n",MALE);//输出0
printf("%d\n",FEMALE);//输出1
printf("%d\n",SECRET);//输出2
return 0;
}
字符串
由双引号引起来的一串字符
int main()
{
"hello world";
"";//空字符串
return 0;
}
#include
int main()
{
char arr1[] = "abc";//数组
//"abc"-'a' 'b' 'c' '\0'-'\0'是字符串的结束标志
//等价于char arr2[] = {'a','b','c',0};或者char arr2[] = {'a','b','c',‘\0’};
//如果是char arr2[] = {'a','b','c'};会输出abc后带随机值
printf("%s\n",arr1);
return 0;
}
#include
int main()
{
char arr1[] = "abc";
char arr2[] = {'a','b','c'};
printf("%d\n",strlen(arr1));//strlen-string length
printf("%d\n",strlen(arr2));
return 0;
}
//输出结果是:3,随机值
//注意:‘\0’是结束标志,不算作字符的内容
ASCII编码
数据在计算机上存储的时候,存储的是二进制
ASCII编码,字符对应的值叫ASCII码值

\0 - 0
0 - 48
a - 97
A - 65
转义字符
转变原来的意思
\?:在书写连续多个问号时使用,防止他们被解析成三字母词,使用后就是普通的连续问号
\':字符常量'
\":字符常量“
\\:防止\被解释为一个转义序列符,使用后就是普通的\
\a:警告字符,蜂鸣
\b:退格符
\f:进纸符
\n:换行
\r:回车
\t:水平制表符 - 一块空
\v:垂直制表符
\ddd:ddd表示1-3个八进制数
\xdd:dd表示2个十六进制数
#include
#include
int main()
{
printf("%d\n",strlen("c:\test\32\test.c"));
return 0;
//结果输出为13
//“\t”是一个转义字符,“\32”也是一个转义字符
//“\32”指ASCII码为32(八进制)对应的字符,即ASCII码为26对应的字符“→”
}
#include
#include
int main()
{
printf("%d\n",strlen("c:\test\382\test.c"));
return 0;
//结果输出为15
//“\t”是一个转义字符,“\3”也是一个转义字符
//注意:8不是八进制中的数字,故“\382”不是转义字符
}
#include
#include
int main()
{
printf("%c\n","\x61");
return 0;
//结果输出为a
//“\x61”指ASCII码为61(十六进制)对应的字符,即ASCII码为97对应的字符“a”
}
注释
①/*……*/缺点是不能嵌套注释,一旦识别到*/就终止
/*
int main()
{
return 0;
}
*/
/*
int main()
{
/*
int a=10;
*/
return 0;
}
*/
②//可以注释一行也可以注释多行
选择语句
#include
int main()
{
int coding = 0;
printf("你要好好学习吗?(要1/不要0):");
scanf("%d", &coding);
if(input == 1)
printf("好工作\n");
else
printf("卖红薯\n");
return 0;
}
循环语句
1.while语句
2.for 语句
3.do…while语句
#include
int main()
{
int num = 1;
while(num < 20)
{
printf("敲一行代码:%d\n",num);
num++;
}
printf("敲完了\n");
return 0;
}
函数
#include
int Add(int x, int y)
{
int z = x + y;
return z;
}
int main()
{
int num1 = 10;
int num2 = 20;
sum = Add(num1, num2);
printf("sum = %d\n", sum);
return 0;
}
数组
int main()
{
int arr[10];//定义一个存放10个整数数字的数组
char ch[20];//定义一个存放20个字符的数组
float arr2[5];//定义一个存放5个浮点数的数组
return 0;
}
#include
int main()
{
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
printf("%d\n",arr[4]);
return 0;
}
//输出为5
//数组的下标从0开始
#include
int main()
{
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
int i = 0;
while(i<10)
{
printf("%d ",arr[i]);
i++;
}
return 0;
}
//输出1 2 3 4 5 6 7 8 9 10
操作符
1.算数操作符
+ - * / %(取余数)
2.移位操作符
左移<< 右移>>(移的是二进制位)
#include
int main()
{
int a = 1;
int b = a<<1;
//整型占4个字节,即32个bit位
//a中存放的是00000000 00000000 00000000 00000001
//左边丢弃,右边补0:00000000 00000000 00000000 00000010,即2
printf("%d\n", b);
return 0;
}
3.位操作符
与& 异或^ 或|
#include
int main()
{
a = 3;
b = 5;
int c=a&b;
//a是011
//b是101
//同位都为1(真)才为1,c=001
printf("%d\n", c);
return 0;
}
//输出为1
#include
int main()
{
a = 3;
b = 5;
int c=a|b;
//a是011
//b是101
//同位只要有1(真)就为1,c=111
printf("%d\n", c);
return 0;
}
//输出为7
#include
int main()
{
a = 3;
b = 5;
int c=a^b;
//a是011
//b是101
//同位相同为0,相异为1,c=110
printf("%d\n", c);
return 0;
}
//输出为6
4.赋值操作符
= += -= *= /= ^= |= >>= <<=
int main()
{
int a = 10;
a = 20;//赋值
a += 10;//复合赋值,等价于a = a + 10;其他同理
return 0;
}
5.单目操作符
!:逻辑反操作
#include
int main()
{
//c语言中0表示假,所有非0表示真
int a = 10;
int b = 0;
printf("%d\n", !a);//输出0
printf("%d\n", !b);//输出1
return 0;
}
-:负值
+:正值
&:取地址
sizeof:操作数的类型长度(单位:字节)
#include
int main()
{
int a = 10;
int arr[10] = {0};
int sz = 0;
sz = sizeof(arr)/sizeof(arr[0])
//sizeof 计算的是变量/类型所占空间的大小,单位是字节
printf("%d\n", sizeof(a));//输出4
printf("%d\n", sizeof(int));//输出4
printf("%d\n", sizeof a);//输出4,说明可省略括号
printf("%d\n", sizeof int);//报错!说明不可省略括号
printf("%d\n", sizeof(arr));//输出40
printf("sz = %d\n", sz);//输出10,计算元素个数
return 0;
}
~:对一个数的二进制按位取反
#include
int main()
{
int a = 0;//4个字节,32bit位
int b = ~a;
printf("%d\n",b);//输出结果是原码,是-1
return 0;
//有符号的整型,第一位数是符号位(0为正,1为负)
//只要是整数,内存中存储的都是二进制【补码】
//正数:原码、反码、补码 相同
//负数:原码 → 符号位不变,其它位取反 → 反码 → +1 → 补码
// 补码 → -1 → 反码 → 符号位不变,其它位取反 → 原码
//00000000000000000000000000000000
//补码:11111111111111111111111111111111
//→反码:1111111111111111111111111111110
//→原码:1000000000000000000000000000001,即-1
}
++,--:前置、后置
#include
int main()
{
int a = 10;
int b = a++;//后置++,先使用,自身再+1
printf("a = %d b = %d\n",a,b);//a = 11 b = 10
int b = ++a;//前置++,自身先+1,再使用
printf("a = %d b = %d\n",a,b);//a = 11 b = 11
int b = a--;//后置--,先使用,自身再-1
printf("a = %d b = %d\n",a,b);//a = 9 b = 10
int b = --a;//前置++,自身先-1,再使用
printf("a = %d b = %d\n",a,b);//a = 9 b = 9
return 0;
}
(类型):强制类型转换
int main()
{
int a = (int)3.14;
return 0;
}
&:取地址(详见【指针】)
*:间接访问操作符/解引用操作符
6.关系操作符
> >= < <= != ==
7.逻辑操作符
逻辑与&&,逻辑或||
0为假,非0为真
8.条件操作符/三目操作符
exp1 ? exp2 : exp3
int main()
{
int a = 10;
int b = 20;
int max = 0;
if (a>b)
max = a;
else
max = b;
return 0;
}
等价于
int main()
{
int a = 10;
int b = 20;
int max = 0;
max = (a > b ? a : b);
//若?前表达式为真,则值为a,否则值为b
return 0;
}
9.逗号表达式
exp1 , exp2,exp3,…,expN
10.下标引用、函数调用和结构成员
[] () . ->
int main()
{
int arr[10] = {0};
arr[4];//[] - 下标引用操作符
return 0;
}
int Add(int x, int y)
{
int z = 0;
z = x + y;
return z;
}
int main()
{
int a = 10;
int b = 20;
int sum = Add(a,b);//() - 函数调用操作符
return 0;
}
常见关键字
auto(自动,局部变量前都省略了)、break、case、char、const、continue、default、do、double、else、enum(枚举)、extern(引入外部符号)、float、for、goto、if、int、long、register(寄存器关键字)、return、short、signed(int = signed int)、sizeof、static、struct(结构体关键字)、switch、typeof、union(联合体/共用体)、unsigned、void、volatile、while
typedef(类型定义/类型重定义)
int main()
{
typedef unsigned int u_int;
unsigned int num1 = 20;
u_int num2 = 20;
//num1和num2的类型完全一样
return 0;
}
static(①修饰局部变量,使其生命周期变长;
②修饰全局变量,使其作用域变小,只能在自己所在的源文件内部使用;
③修饰函数,使其外部链接属性变为内部链接属性,只能在自己所在的源文件内部使用;)
#include
void test()
{
static int a = 1;//a是一个静态的局部变量
a++;
printf("a = %d\n", a);//2 3 4 5 6
}
int main()
{
int i = 0;
while (i<5)
{
test();
i++;
}
return 0;
}
static int g_val = 2020;//这一行是写在另一个.c文件里的
//加了static会让下面的代码报错
#include
int main()
{
//extern - 声明外部符号的
extern int g_val;
printf("g_val = %d\n",g_val);
return 0;
}
static int Add(int x, int y)
{
int z = x + y;
return 0;
}
//以上代码是写在另一个.c文件里的
//加了static会让下面的代码报错
#include
extern in Add(int, int);
int main()
{
int a = 10;
int b = 20;
int sum = Add(a, b);
printf("sum = %d\n", sum);
return 0;
}
#define定义常量和宏
定义常量详见【常量】,定义宏:
#include
//函数的定义
Max(int x, int y)
{
if (x > y)
return x;
else
return y;
}
//宏的定义
#define MAX(X,Y) (X>Y?X:Y)//只要输入MAX(X,Y),就会自动换成 X>Y?X:Y
int main()
{
int a = 10;
int b = 20;
//函数的方式
int max = Max(a, b);
printf("max = %d\n", max);
//宏的方式
max = MAX(a, b);
printf("max = %d\n", max);
return 0;
}
指针
int main()
{
int a = 10;//4个字节
int* p = &a;//指针变量:用来存放地址,&是取地址
printf("%p\n", p);//打印出a的地址
*p = 20;//* - 解引用操作符
printf("%p\n", a);//打印出20
return 0;
}
int main()
{
char ch = 'w';
char* pc = &ch;
*pc = 'a';
printf("%c\n", ch);//打印出a
return 0;
}
指针变量的大小:在32位平台是4个字节,64位平台是8个字节