人和计算机交流的语言;C语言是一门通用的计算机编程语言,广泛应用于底层开发。
为了避免各开发厂商用的C语言语法产生差异,由美国国家标准局为C语言制定了一套完整的语法,称为ANSI C,作为最初的标准。
编译器主要有Clang、GCC、WIN-TC、SUBLIME、MSVC等。
C++控制台应用
源文件右键-添加-新建项-C++文件-改名.c后缀。
#include //引用头文件
int main()
{ //main函数是程序的入口,一个工程中有且仅有一个
printf("hello bit\n"); //输出hello bit printf-库函数-在屏幕上打印信息,引用头文件stdio.h
printf("hehe\n"); //输出hehe
return 0;
}
常量 - 不能改变的量
变量 - 能被改变的量
局部变量 - 大括号内部的变量
全局变量 - 大括号外部的变量
当局部变量和全局变量名字冲突的情况下,局部变量优先(不建议全局变量和局部变量名字写成一样)
出现scanf unsafe错误,方法一:#define _CRT_SECURE_NO_WARNINGS 1
1.局部变量的作用域是变量所在的局部范围。
2.全局变量的作用域是整个工程。
(来自外部已定义的全局变量,使用前需先用extern声明)
1.局部变量的生命周期是进入作用域开始,出作用域结束。
2.全局变量的生命周期是整个程序的生命周期。
C语言中的常量分为以下几种:
#include
#define MAX 100
#define STR "abcdef"
enum Color
{
//枚举常量
RED, //可能的取值,不会申请空间,不可更改
GREEN,
BLUE
};
enum Sex
{
MALE,
FEMALE,
SECRET
};
int main()
{
//字面常量
30;
3.14;
'w';
"abc";
//const修饰的常变量
const int num = 3;
//num = 4; //常变量不能修改
printf("%d\n", num);
//#define定义的标识符常量
printf("%d\n", MAX);
int a = MAX;
printf("%d\n", a);
printf("%s\n", STR); //%s打印字符串
//枚举常量
//三原色
enum Color c = RED; //创建枚举变量,赋值RED;在创建变量的时候才会申请空间
return 0;
}
由双引号引起的一串字符称为字符串字面值,简称字符串。
字符串的结束标志是一个\0的转义字符。在计算字符串长度的时候\0是结束标志,不算作字符串内容。
int main()
{
/*char ch= 'a'字符类型
C语言中没有字符串*/
char arr1[] = "abcdef"; //末尾是\0,是结束标志
char arr2[] = { 'a','b','c','d','e','f' };
char arr3[] = { 'a','b','c','d','e','f','\0'};
printf("%s\n", arr1);
printf("%s\n", arr2);
printf("%s\n", arr3);
return 0;
}
0 - 数字0
'0' - 字符0 - ASCII值是48
'\0' - 字符 - ASCII值是0
EOF - end of file 文件结束标志 值是-1
转义字符 - 转变原符号意思
转义字符 | 释义 |
---|---|
\? | 书写连续多个问号的时候使用,防止被解析成三字母词 |
\' | 用于表示字符常量' |
\" | 用于表示字符常量" |
\\ | 用于表示一个反斜杠,防止被解释成一个转义序列符 |
\a | a警告字符,蜂鸣 |
\b | 退格符 |
\f | 进纸符 |
\n | 换行 |
\r | 回车 |
\t | 水平制表符 |
\v | 垂直制表符 |
\ddd | ddd表示1~3个八进制的ASCII编码字符 |
\xdd | dd表示2个十六进制的ASCII编码字符 |
格式 | 释义 |
---|---|
%d | 打印整型 |
%c | 打印字符 |
%s | 打印字符串 |
%f | 打印float类型的数据 |
%lf | 打印double类型的数据 |
%zu | 打印sizeof的返回值 |
%p | 打印地址 |
两种注释风格:
快捷键Ctrl+E、C注释,Ctrl+E、U解除注释。
int main()
{
printf("加入比特\n");
printf("要好好学习吗(1/0)");
int a = 0;
scanf("%d", &a);
if (a == 1)
printf("好offer");
else
printf("卖红薯");
return 0;
}
int main()
{
int line = 0;
printf("加入比特\n");
while (line != 10) //line小于10的时候保持循环
{
printf("写代码\n");
line++;
} //大于10的时候跳出循环
if (line >= 10)
{
printf("好offer");
}
return 0;
}
简化代码,方便代码的复用。
一组相同类型元素的集合。
中括号内写常量则元素个数为所写常量,没写常量则数组根据后面括号内的元组个数自动创建。
int arr[10]={0,1,2,3,4,5,6,7,8,9}; //整型数组,中括号内有常量则最多放所写常量数个
数组的每个元素都有一个下标,下标是从0开始的。
int arr[10] = { 1 };
int i = 0;
while (i < 10)
{
printf("%d ", arr[i]);
i++;
}
printf("\n");
算术操作符
+ - * / % |
移位操作符
>> << |
位操作符
& ^ | |
赋值操作符
= += -= *= /= &= ^= |= >>= <<= |
单目操作符(只有一个操作数的操作符)
! | 逻辑反操作 |
- | 负值 |
+ | 正值 |
& | 取地址 |
sizeof | 操作数的类型长度(以字节为单位) |
~ | 对一个数的二进制按位取反 |
-- | 前置、后置-- |
++ | 前置、后置++ |
* | 间接访问操作符(解引用操作符) |
(类型) | 强制类型转换 |
关系操作符
> >= < <= != == |
逻辑操作符
&& || |
条件操作符
exp1?exp2:exp3 |
逗号表达式(从左向右依次计算,整个表达式的结果是最后一个表达式的结果)
exp1,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 |
define不是关键字,是预处理指令。
变量的命名:
类型定义,可以理解为类型重命名。
int main()
{
typedef unsigned int uint;
unsigned int num0 = 10;
uint num1 = 10; //unsigned int和uint等价
return 0;
}
static是用来修饰变量和函数的
static修饰局部变量的时候,局部变量出了作用域,不销毁。
本质上,static修饰局部变量的时候,改变了变量的存储位置。影响了变量的生命周期,和程序的生命周期一样。
void test()
{
static int a = 1; //static修饰局部变量的时候,局部变量出了作用域,不销毁。
a++; //本质上,static修饰局部变量的时候,改变了变量的存储位置。
printf("%d\n", a); //影响了变量的生命周期,和程序的生命周期一样。
}
int main()
{
int i = 0;
while (i < 10)
{
test();
i++;
}
return 0;
}
static修饰全局变量的时候,这个全局变量的外部链接属性就变成了内部链接属性。
其他源文件(.c)就不能再使用到这个全局变量了。同时也改变了变量的存储位置。
同全局变量。
static修饰函数的时候,这个函数的外部链接属性就变成了内部链接属性。
其他源文件(.c)就不能再使用到这个函数了。同时也改变了函数的存储位置。
宏是完成替换的,本质是把x+y替换到ADD的位置上。
#define ADD(x,y) ((x)+(y)) //定义一个宏,宏的定义是有参数的
int main()
{
int a = 10;
int b = 20;
int c = ADD(a, b);
printf("%d\n", c);
return 0;
}
为了有效地使用内存,给每个内存单元进行编号,这些编号称为该内存的内存单元的地址。
地址也被称为指针。用来存放指针(地址)的变量也被称为指针变量。
不管是什么类型的指针,创建的时候都是在创建指针变量,指针变量是用来存放地址的,指针变量的大小取决于一个地址存放的时候需要多大的空间。32位机器上的地址:32bit位 - 4字节,所以指针变量的大小是4个字节。64位机器上的地址:64bit位 - 8字节,所以指针变量的大小是8个字节。
C语言给了自定义类型的能力,自定义类型中有一种叫:结构体struct。
把一些单一类型组合在一起的做法。
struct Stu //类型,不占空间,在创建对象的时候才会占用空间。
{
char name[20];
int age;
char sex[10];
char tele[12];
};
void print(struct Stu* ps) //输入的ps为指针变量,是s的地址
{
printf("%s %d %s %s", (*ps).name, (*ps).age, (*ps).sex, (*ps).tele); //因为ps是指针,先*ps解引用找到s,再引用成员名
printf("%s %d %s %s", ps->name, ps->age, ps->sex, ps->tele); //指针变量->成员名,直接找到成员
}
int main()
{
struct Stu s = { "zhangsan",20,"nan","10010001000" }; //创建对象并且初始化
printf("%s %d %s %s\n", s.name, s.age, s.sex, s.tele); //打印对象成员 结构体对象.成员名
print(&s);
return 0;
}