一、数据类型
char | 字符数据类型 | 1byte |
short | 短整型 | 2byte |
int | 整形 | 4byte |
long | 长整型 | 4byte |
longlong | 长长整形 | 8byte |
float | 单精度浮点数 | 4byte |
double | 双精度浮点数 | 8byte |
二、变量常量
1.变量
变量分为局部变量和全局变量
include <stdio.h> int global = 2019;//全局变量 int main() { int local = 2018;//局部变量 //下面定义的global会不会有问题? int global = 2020;//局部变量 printf("global = %d\n", global); return 0; }//没有问题,当局部变量与全局变量重名时,局部变量优先使用
变量有作用域和生命周期
①作用域
作用域是程序设计概念,通常来说,一段程序代码中所用到的名字并不总是有效/可用 的
1. 局部变量的作用域是变量所在的局部范围。 2. 全局变量的作用域是整个工程。
②生命周期
变量的生命周期指的是变量的创建到变量的销毁之间的一个时间段
1. 局部变量的生命周期是:进入作用域生命周期开始,出作用域生命周期结束。 2. 全局变量的生命周期是:整个程序的生命周期。
2.常量
#include <stdio.h> //举例 enum Sex { MALE, FEMALE, SECRET }; //括号中的MALE,FEMALE,SECRET是枚举常量 int main() { //字面常量演示 3.14; //字面常量 1000; //字面常量 //const 修饰的常变量 const float pai = 3.14f; //这里的pai是const修饰的常变量 pai = 5.14;//是不能直接修改的!! ! //#define的标识符常量 演示 #define MAX 100 printf("max = %d\n", MAX); //枚举常量演示 printf("%d\n", MALE); printf("%d\n", FEMALE); printf("%d\n", SECRET); //注:枚举常量的默认是从0开始,依次向下递增1的 return0; }
①字面常量
②const 修饰的常变量
③#define 定义的标识符常量
④枚举常量
三、字符串和转义字符
#include <stdio.h> //下面代码,打印结果是什么?为什么?(突出'\0'的重要性) int main() { char arr1[] = "bit"; \\这种由双引号引起来的就叫字符串 char arr2[] = {'b', 'i', 't'}; \\这个单引号引起来的叫字符 char arr3[] = {'b', 'i', 't', '\0'}; \\“\0”是字符串的结束标志,定义字符串时默认后面加上了字符串 printf("%s\n", arr1); printf("%s\n", arr2); printf("%s\n", arr3); return 0; }
常见转义字符 | |
\? | 在书写连续多个问号时使用,防止他们被解析成三字母词 |
\' | 用于表示字符常量 ' |
\" | 用于表示一个字符串内部的 " |
\\ | 用于表示一个反斜杠,防止它被解释为一个转义序列符 |
\a | 警告字符,蜂鸣 |
\b | 退格符 |
\f | 进纸符 |
\n | 换行符 |
\r | 回车 |
\t | 水平制表符 |
\v | 垂直制表符 |
\ddd | ddd表示1~3个八进制的数字。 如: \130 X |
\dd | dd表示2个十六进制数字。 如: \x30 0 |
例题:
//程序输出什么? #include <stdio.h> int main() { printf("%d\n", strlen("abcdef")); // \62被解析成一个转义字符 printf("%d\n", strlen("c:\test\628\test.c")); return 0; }
四、选择语句
1.if语句
if;else if;else;
&&与 ||或
表达式1?表达式2:表达式3
(如果表达式1成立则输出表达式2,如果表达式1不成立则输出表达式3)
例:
1. \\比较大小,输出较大值 2. a>b?printf("%d”,a):printf("%d",b);
2.switch语句
#include<stdio.h> int main() { int a; scanf("%d",&a); switch(a) { case 1:printf("男\n");break; case 2:printf("女\n");break; case 3:printf("未知\n");break; default:printf("输入不合法\n");//输入值上面均不存在 } return 0; }
五.循环语句
1.for循环
//输出a个* #include<stdio.h> int main() { int a; scanf("%d",&a); for(int i=1;i<=a;i++)//循环的次数为a { printf("*");//每次输出一个* } return 0; }
1、break,结束当前循环结构的循环
2、continue,只结束满足条件的循环,后续循环继续执行
2.while循环
while循环内容: 若表达式为真则执行循环体的内容;若表达式为假则结束循环;先判断再执行循环体
while(表达式)
{
循环体;
}
//输出十个* #include<stdio.h> int main() { int a=1; while(a<=10) { printf("*"); a++; } return 0; }
3.do-while循环
先循环一次循环体,然后求解表达式,若表达式为真,则继续执行do while语句中循环体,否则执行循环体的下一步;先执行循环体,再判断
do
{
循环体;
}while(表达式);
//输出十次* #include<stdio.h> int main() { int a=1; do { printf("*"); a++ }while(a<=9); //注意这里需要用到分号 ; return 0; }
五、函数
主要就是可以把代码简化,并且重复使用
include <stdio.h> int main() { int num1 = 0; int num2 = 0; int sum = 0; printf("输入两个操作数:>"); scanf("%d %d", &num1, &num2); sum = num1 + num2; printf("sum = %d\n", sum); return 0; } //上述代码,写成函数如下: #include <stdio.h> int Add(int x, int y)//这里就相当于定义了一个名为ADD的函数 { int z = x+y; return z; } int main() { int num1 = 0; int num2 = 0; int sum = 0; printf("输入两个操作数:>"); scanf("%d %d", &num1, &num2); sum = Add(num1, num2); //这里使用了这个ADD函数 printf("sum = %d\n", sum); return 0; }
六、数组
1.数组的下标
C语言规定:数组的每个元素都有一个下标,下标是从0开始的。
数组可以通过下标来访问的。
2.数组的使用
#include <stdio.h> int main() { int i = 0; int arr[10] = {1,2,3,4,5,6,7,8,9,10}; for(i=0; i<10; i++) //循环依次输出1-10 { printf("%d ", arr[i]); } printf("\n"); return 0; }
例题:班级成绩输入输出_牛客题霸_牛客网 (nowcoder.com)
七、操作符
①算数操作符
+ - * / %
②移位操作符
>> <<
③位操作符
& ^ |
④赋值操作符
= += -= *= /= &= ^= |= >>= <<=
⑤单目操作符
! 逻辑反操作 - 负值 + 正值 & 取地址 sizeof 操作数的类型长度(以字节为单位) ~ 对一个数的二进制按位取反 -- 前置、后置-- ++ 前置、后置++ * 间接访问操作符(解引用操作符) (类型) 强制类型转换
⑥关系操作符
> >= < <= != ==
⑦逻辑操作符
1. && 逻辑与 2. || 逻辑或
⑧条件操作符
1. xp1 ? exp2 : exp3 2. //具体可以看上面选择语句
⑨逗号表达式
xp1, exp2, exp3, …expN
⑩下标引用、函数调用和结构成员
[] () . ->
八、常见关键字
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
①typedef
顾名思义是类型定义,这里理解为类型重命名。
//将unsigned int 重命名为uint_32, 所以uint_32也是一个类型名 typedef unsigned int uint_32; int main() { //观察num1和num2,这两个变量的类型是一样的 unsigned int num1 = 0; uint_32 num2 = 0; return 0; }
②关键字static
在C语言中: static是用来修饰变量和函数的
1. 修饰局部变量-称为静态局部变量
2. 修饰全局变量-称为静态全局变量
3. 修饰函数-称为静态函数
九、define定义常量和宏
//define定义标识符常量 #define MAX 1000 //define定义宏 #define ADD(x, y) ((x)+(y)) #include <stdio.h> int main() { int sum = ADD(2, 3); printf("sum = %d\n", sum); //输出5 sum = 10*ADD(2, 3); printf("sum = %d\n", sum); //输出50 return 0; }
十、指针
注意:32位处理器一个指针的大小为4byte
64位处理器一个指针的大小为8byte
十一、结构体
结构体可以存储若干个信息,使得c语言可以描述复杂类型
比如描述学生,学生包含: 名字+年龄+性别+学号 这几项信息。
struct Stu { char name[20];//名字 int age; //年龄 char sex[5]; //性别 char id[15]; //学号 };
//打印结构体信息 struct Stu s = {"张三", 20, "男", "20180101"}; //.为结构成员访问操作符 printf("name = %s age = %d sex = %s id = %s\n", s.name, s.age, s.sex, s.id); //->操作符 struct Stu *ps = &s; printf("name = %s age = %d sex = %s id = %s\n", ps->name, ps->age, ps->sex, ps- >id);