- 注释
- 选择结构
- 循环结构
- 函数
- 数组
- 操作符
- 常见关键字
1、注释
/* */ 多行注释,不能嵌套注释(/* /* ...*/ */,第一三会配对,第四个不是注释,会报错)
// 单行注释
#if 0---#endif 可注释代码块,将0改为1就取消注释了
2、选择结构
if-else:
其按从上到下的顺序依次判断后选择执行
#include<stdio.h>
void main()
{
int a, b, max;
printf("请输入要比较的两个整数:\n");
scanf_s("%d %d", &a, &b);
if (a > b)
{
max = a;
printf("max = %d\n", a);
}
else if(a < b)
{
max = b;
printf("max = %d\n", b);
}
else
{
printf("两者相等");
}
return 0;
}
3、循环结构
3.1 for循环:
for(循环变量初始值;判断条件;循环变量操作)
void main()
{
int i;
int sum = 0;
//前++,先自增,再参与运算
//后++,先参与运算,再自增
//前++比后++少一个存当前值的临时变量
for (i = 0; i <= 100; ++i)
{
sum += i; //sum = sum + i; //求1到100的和
}
printf("1 + 2 + ... + 100 = %d\n", sum);
}
关于前自加和后自加:
void main()
{
int a = 0;
printf("%d %d %d %d\n", a++, ++a, a++, ++a); //3 4 1 4
//分号之前就进行了前自加运算,不同的平台结果可能不同
int b = 0;
int bb = (b++) + (b++);
printf("%d\n", bb); //0 = 0+0
int c = 0;
int cc = (c++) + (++c);
printf("%d\n", cc); //2 = 1+1
int d = 0;
int dd = (++d) + (++d);
printf("%d\n", dd); //4 = 2+2
int e = 0;
int ee = (++e) + (e++);
printf("%d\n", ee); //2 = 1+1
}
3.2 while循环
void main()
{
int i = 0;
int sum = 0;
while (i <= 100)
{
sum += i;
++i;
}
printf("sum = %d\n", sum);
}
3.3 do-while循环
void main()
{
int i = 0;
int sum = 0;
do
{
sum += i;
++i;
} while (i <= 100);
printf("sum = %d\n", sum);
}
4、函数
简化代码,代码复用
函数名、返回值、参数
简单的示例:
int Maxvalue(int a, int b)
{
int max;
if (a > b)
{
max = a;
printf("max = %d\n", a);
}
else if (a < b)
{
max = b;
printf("max = %d\n", b);
}
else
{
printf("两者相等");
}
return 0;
}
void main()
{
int a, b;
printf("请输入要比较的两个整数:\n");
scanf_s("%d %d", &a, &b);
Maxvalue(a, b);
5、数组
#include<stdio.h>
int arrw[5]; //未初始化
void main()
{
//int arr[10]; //空间大小为10,下标从0开始,arr是空间名
for (int i = 0; i < 5; ++i)
{
printf("%d\n", arrw[i]);
/*0
0
0
0
0*/
}
printf("\n");
int arr1[5]; //完全未初始化的数组
for (int i = 0; i < 5; ++i)
{
printf("%d\n", arr1[i]);
/*-858993460
-858993460
-858993460
-858993460
-858993460*/
}
printf("\n");
int arr2[5] = {1,2}; //未完全初始化的数组,未初始化部分用0填充
for (int i = 0; i < 5; ++i)
{
printf("%d\n", arr2[i]);
/*1
2
0
0
0*/
}
}
6、操作符
算术操作符:+ - * / %
移位操作符:>> <<
位操作符:& ^ |
赋值操作符:= += -= *= /= &= ^= |= >>= <<=
单目操作符:
! 逻辑取反
- 负值
+ 正值
& 取地址
sizeof 操作数的类型长度,以字节为单位
~ 对一个数的二进制按位取反
-- 自减
++ 自增
* 间接访问操作符(解引用操作符)
(类型) 强制类型转换
关系操作符:> >= < <= != ==
逻辑操作符:&& ||
条件操作符:exp1? exp2 : exp3
逗号表达式:exp1, exp2, ...expn
下标引用、函数调用和结构成员:[] () . ->
void main()
{
int a = 1;
int b = 2;
int v = a || ++b;
printf("v = %d\n", v); //1
printf("b = %d\n", b); //2,逻辑或运算为短路运算,前面为真时,后面将不参与运算
}
7、常见关键字
auto break case char const continue default do double else enum
extern float for goto if int long register return short signed
sizeof static struct switch typedef union unsigned void volatile while
7.1 关键字typedef
类型定义,可以理解为类型的重命名
#include<stdio.h>
typedef unsigned int u_int; //类型定义,把原来的类型重新取了个名字
#define u_int_32 unsigned int //宏定义
void main()
{
//以下三种方式定义无符号整型都可以
unsigned int a = 1;
u_int b = 1;
u_int_32 c = 3;
}
7.2 关键字static
static用来修饰变量和函数:
静态局部变量
静态全局变量
静态函数
(1)static修饰局部变量:
改变了变量的生命周期,让静态局部变量出了作用域依然存在直到程序结束,生命周期才结束
代码1:
void test()
{
int i = 0;
i++;
printf("%d", i);
}
void main()
{
int i = 0;
for (i = 0; i < 10; i++)
{
test(); //1111111111
}
return 0;
}
代码2:
void test()
{
static int i = 0; //static修饰局部变量
i++;
printf("%d", i);
}
void main()
{
int i = 0;
for (i = 0; i < 10; i++)
{
test(); //12345678910
}
return 0;
}
(2)static修饰全局变量:
一个全局变量被static修饰,使得这个全局变量只能在本源文件内使用,不能在其他源文件内使用。
代码1:
int g_val = 2018;
void main()
{
printf("%d\n", g_val); //2018
return 0;
}
代码2:编译时会出现连接性错误
//add.c 文件中
static int g_val = 2018;
//test.c 文件中
void main()
{
printf("%d\n", g_val);
return 0;
}
(3)static修饰函数:
一个函数被static修饰,使得这个函数只能在本源文件内使用,不能在其他源文件内使用。
代码1:
int Add(int x, int y)
{
return x + y;
}
void main()
{
printf("%d\n", Add(2, 3)); //5
return 0;
}
代码2:编译时会出现连接性错误
//add.c文件中
static int Add(int x, int y)
{
return x + y;
}
//test.c文件中
void main()
{
printf("%d\n", Add(2, 3));
return 0;
}