这是我在学习过程中的笔记,总结的经验,踩过的坑。希望能对你有所帮助。持续缓慢更新......
C语言——编程语言的基础
目录
你的第一个C语言程序
一、注释的使用
1、注释的风格:
2、注释快捷键
二、数据类型
三、变量与常量
3.1变量
3.1.1变量的定义
3.1.2变量的分类
3.1.3变量的使用及特点
3.2常量
3.2.1字面常量
3.2.2const修饰的变量
3.2.3#define定义的标识符常量
3.2.4枚举常量
四、字符串和转义字符
4.1字符串
4.2转义字符
五、选择语句
六、循环语句
七、函数
八、数组
8.1定义
8.2使用
九、操作符
类型
十、常见关键字
(1)typedef——类型重命名
(2)static
十一、#define 定义常量和宏
十二、指针
十三、结构体
建立结构体
结构体的使用
现在,是的就是现在。打开你的Dev-C++或者VS或者......(安装方法以及如何新建项目并运行,可上b站搜索,我用的是VS。要安装最新版!)
在屏幕上打出以下代码,运行结果。
#include
int main()
{
printf("hello\n");
return 0;
}
注释,用来解释自己的代码,为了让自己或者他人更好的理解代码的含义,或者注释掉不需要的代码。
/* 第一种 C语言风格
...可惜不能嵌套使用
...
*/
//第二种 C++风格
//...可以一行,可以多行注释
//...
vs——选中目标内容,设置注释,ctrl+k+c;取消注释,ctrl+k+u
注释要简洁明了,尽量减少使用,不要出现写一行代码就有一行注释,以及无意义的注释。如以下
为错误示例。
#include
int main()
{
int a=1; // 赋值a=1
return 0;
}
代码1.1 注释错误示例
先来看看计算机中的单位:
符号 | 换算 |
bit | |
byte--字节 | =8 bit |
kb | =1024 byte |
mb | =1024 kb |
gb | =1024 mb |
tb | =1024 gb |
pb | =1024 tb |
牢记1 字节 = 8 bit
数据类型:
1.char——字符型——1字节——8 bit——表达范围:
有符号:-128——127
无符号: 0——255
2.short int——短整型——2字节——16 bit——表达范围:
有符号:-32768——32767
无符号:0——65535
3.int——整型——4字节——32bit——表达范围:
有符号:-2147483648——2147483647
无符号:0——4294967295
4.long int——长整型——4字节——32bit——-表达范围:
有符号:-2147483648——2147483647
无符号:0——4294967295
5.float——浮点型——4字节——32bit——有效数字位数: 6~7位
6.double——双精度型——8字节——64bit——有效数字位数: 12~16位
有时,你会见到在数据类型前加 unsigned,如:unsigned int ,意为 无符号整型。
当然也有 signed ,但是通常省略,也就是说,默认数据类型是有符号的。
补充:字符型在计算机中以对应的ASCII码存储
记住以下ASCII对应字符:
48~57---'0'~'9'
65~90 ---'A'~'Z'
97~122---'a'~'z'
(图源网络)
改变的值用变量来表示。
输入格式:
类型名 变量名 = 内容;
一般,变量名采用有意义的英文单词,字母,缩写......总之便于你或他人理解含义就好。小写。
int a = 100;
char b = 'd';
float c = 22.4
代码3.1.1 变量定义
局部变量:一对大括号内部的变量
全局变量:少使用!
#include
int a = 1; //全局变量
int main()
{
int b = 2; //局部变量
int a = 3; //局部变量
return 0;
}
代码3.1.2 变量的分类
如果输出 a,那么输出的值应该是多少呢?
输出的是a=3
图3.1.2 局部变量
局部变量如果和全局变量的名字一样,以局部变量优先,所以最好不要让他俩名字相同。
(1)变量的使用
#include
int main()
{
int a = 0;//这是初始化变量
int b = 0;
scanf("%d%d", &a, &b);
printf("%d,&d\n", a, b);
return 0;
}
代码3.1.3 变量的使用
在这里强调一下,所有的符号均为英文符号!
1.scanf("格式占位符",&变量名);
int a = 0;
int b = 0;
int c = 0;
scanf("%d",&a);
scanf("%d%d",&b,&c);
代码3.1.4 scanf
%c | 一个字符 | |
%s | 字符串 | |
%d,%i | 有符号的十进制整数 | |
%f,%lf | 十进制浮点型,或双精度型,带小数点 | 如 3.45 |
%e | e--科学记数法浮点型 | 如 2.4e01 |
%E | E--科学记数法浮点型 | 如 2.4E01 |
%g 或 %G | 根据数据自动选择 %f 或 %e | |
%p | 输出地址 | |
%o | 无符号八进制整数 | |
%u | 无符号十进制整数 | |
%X | 无符号十六进制 | 大写A~F |
%x | 无符号十六进制 | 小写a~f |
%% | 输出一个% |
在英文双引号内部是什么,从键盘输入的内容就是什么。
例如:
图3.1.3 举例
第一行 为输入内容,第二行 为输出内容。如果不输入逗号,会发生什么呢?
图3.1.4 举例
试一试如下代码段:
char a = 0;
char b = 0;
scanf("%c%c", &a, &b);
printf("%c %c", a, b);
代码1.5 字符型举例
输入:a空格b,结果是:
图3.1.5 结果
在字符型中,空格,回车,Tab都算字符。
所以,在scanf中除了变量的数据类型,必要的格式以外,最好不要再添加其他内容,以免从键盘输入时,给自己或他人制造麻烦。
2.printf("输入的内容\n",变量名);
例如:
#include
int main()
{
int a = 520;
printf("我喜欢C语言\n");
printf("%d\n", a);
return 0;
}
代码3.1.6 printf
图3.1.6 结果
(2)变量作用域与生命周期
1.变量的作用域
意为,变量名可以使用的代码范围。
1.局部变量:变量所在的范围
2.全局变量:整个工程
2.变量的生命周期
意为,变量从建立到销毁的时间段。
1.局部变量:进入局部变量作用域——出作用域
2.全局变量:整个程序的生命周期
#include
int b = 2;
int main()
{
int a = 1;
{
int c = 3;
}
printf("%d\n", a);
printf("%d\n", b);
printf("%d\n", c);
return 0;
}
代码3.1.7 作用域及生命周期
图3.1.7 结果
c的作用域只在离它最近的一对大括号内。
生命周期的在学到函数后,会有更好的理解。
int a = 1;
char b = 'b';
float c = 1.3;
const int a = 1;
// a = 2;
const 修饰的变量具有常属性,必须在定义时就初始化,即赋值。赋值后不可再次修改,即此时a为常量。
若令a=2,则报错。
图2.2 报错
#include
#define a 10
int main()
{
//...
return 0;
}
#include
enum people
{
name,
sex
};
int main()
{
enum people ww = name;
return 0;
}
注意,enum中的元素即枚举常量之间用 逗号 , 最后一个元素无符号,大括号外为 分号 ;
(1)定义:由 " " 英文双引号引起来的一串字符
字符串以 '\0' 作为结束标志
(2)打印字符串的格式:
char ch1[] = "abc";
printf("%s\n",ch1);
char ch2[4] = { 'a','b','c' };
printf("%s\n", ch2);
代码4.1 字符串
图4.1输出结果
为什么ch3输出的内容是乱码呢?
定义ch3时,以数组(去看看目录中的数组在哪儿吧!)的形式定义,未指明个数,则自动计算个数=3,不会添加 '\0' 。程序在执行这段代码时,直到遇到 '\0' 才会停止。它只是字符数组。
而 ch1这种定义方式,"abc" 就是字符串,结尾自动补 '\0'。
ch2以数组形式定义,最后一个元素自动赋值0,即 '\0' 。程序执行时遇到它也可以停止,则ch2也是字符串。
合格的字符串一定是字符数组,合格的字符数组未必是合格的字符串。
(3)计算字符串的长度
#include //引入头文件,使用strlen
#include
int main()
{
char ch1[] = "abc";
printf("%d\n",sizeof(ch1));
printf("%d\n",strlen(ch1));
return 0;
}
代码4.2 计算字符串
可以使用sizeof计算,也可以使用string库里的strlen计算。
图4.2 结果
strlen:用来计算 '\0' 前的字符串长度
sizeof计算了ch1里所有的元素长度,以字节为单位:4个元素 * 每个字符型1字节 = 4字节
看看下面的代码:
char ch3[] = {'a', 'b', 'c', '\0'};
用strlen计算是多少呢?
结果是
由此可见 在字符串中 '\0' 有多重要了吧!
字符形式 | 功能 |
\a | 响铃 |
\n | 换行 |
\r | 回车 |
\f | 换页 |
\t | Tab制表符 |
\b | 回退一格 |
\v | 竖向跳格 |
\\ | 反斜线字符,可输出 \ |
\' | 单引号字符,可输出 ' |
\" | 双引号字符,可输出 " |
\0 | 空值 |
\ddd | 输出1~3位八进制数所代表的字符,即八进制转换为十进制作为ASCII码,所对应的字符。如:\123 |
\xdd | 输出1~2位十六进制数所代表的字符,如:\x123 |
补充:各个进制转换
详解计算机基础:二进制,八进制,十进制,十六进制之间的互相转换_MuqiuWhite的博客-CSDN博客
#include
int main()
{
int in = 0;
printf("喜欢编程吗?\n0.不喜欢。1.喜欢\n");
scanf("%d", &in);
if (in == 0)
{
printf("呜呜~\n");
}
else
{
printf("加油!\n");
}
return 0;
}
(1)while语句
(2)for语句:循环条件一目了然
(3)do...while语句:先进行一次再判断是否继续循环
//while语句的例子
#include
int main()
{
int i = 0;
printf("一年有多少天应该在认认真真的学习并且收获到知识呢?\n");
while (i < 366)
{
printf("%d天\n", i);
i++;
}
return 0;
}
上图为输出的结果的一部分,循环便是不断重复,直到达到某个条件。要注意条件的设置,避免出现死循环,减少不必要的循环。
#include
int add(int a, int b)//add函数为自定义求和函数
{
return a + b;
}
int main()
{
int a = 2, b = 5;
int num=add(a, b);
printf("%d\n", num);
return 0;
}
程序是由多个函数组成的,函数用来减少减少代码量,重复使用。
一组同类型元素的集合,下标从0开始。
数组类型 数组名[内容个数]={内容};
int a[3] = { 1,2,3 };
char b[] = "hello";//这种形式也叫字符串
int a[3] = { 1,2,3 };
int i = 0;
for (i = 0; i < 3; i++)
{
printf("%d ", a[i]);
}
数组的输出要用循环,字符串可以不用。
(1)算术运算符
+ - * / %(用于整数取余)
(2)移位运算符(用于字符/整数)
补码移动。
>>右移(分为逻辑移位和算术移位) 移动几个位置,十进制数就÷几个2
<<左移 移动几个位置,十进制数就×几个2
(3)位运算符(化为二进制比较)
&按位与:
^按位异或
|按位或
(4)赋值(=左边必须是单个变量)、复合运算符(结合性从右向左)
=、+=、-=、*=、/=、%=、>>=、<<=、&=、^=、|=
(5)单目运算符(结合性从右向左)
! | 逻辑非 |
~ | 按位取反(二进制位) |
+ | 正号 |
- | 负号 |
++ | 自增 |
-- | 自减 |
(类型) | 强制类型转换 |
* | 指针运算符(解引用) |
& | 地址与指针运算符(取地址) |
sizeof(变量名/数据类型标识符) | 操作数的类型长度(字节为单位) |
(6)关系操作符
<、<=、>=、>
== 是否相等、!= 是否不相等
(7)逻辑运算符
&&逻辑与
||逻辑或
(8)条件运算符(从右往左)
?:
若符合条件则输出冒号左边的,不符合输出右边的。
(9)逗号表达式
a,b,c,……
从左到右依次计算,结果取最右边的。
(10)单体运算符
() | 圆括号 |
[ ] | 下标运算符,操作数为数组名和[ ]里的内容 |
-> | 指向结构体成员运算符 |
. | 结构体成员运算符 |
unsigned int a = 2;
printf("%d\n", a);
typedef unsigned int ti;
ti b = 3;
printf("%d\n", b);
由此可见,typedef将 unsigned int 重命名为ti,二者功能一致。
typedef适用于将繁琐的类型名重命名。比如结构体类型。
1.修饰局部变量
a.不随函数结束而消亡
b.只初始化一次
c.保存上一次的值
2.修饰全局变量
使得该全局变量只能在本源文件中使用。
修饰变量时,若没有初始化,会自动初始化变量为0;
3.修饰函数
使得该函数只能在本源文件中使用。
define不是关键字,是编译器实现的,用来定义宏的预处理指令,不是C语言中的内容。
定义的常量:
#define min 100;
定义的宏:
#define 宏的类型(参数名)(宏体)
#define DEA(x, y) ((x)-(y))
#include
int main()
{
int sum = DEA(2, 3);
printf("sum = %d\n", sum);
sum = 100*ADD(2, 3);
printf("sum = %d\n", sum);
return 0;
}
指针就是地址。每个变量都有地址,存放地址的变量叫做指针变量。
int a = 3;
printf("%p\n",&a)//取出a的地址并输出
int a = 5;
int* p = &a;
printf("%d\n",*p);//通过找到p里存放的地址,找到a
输出结果为 5。
int a = 5;
int* p = &a;//定义一个指针变量p并初始化,赋给p一个地址
*p = 3;//改变*p,也就是a的值
printf("%p\n", &a);
注意:int* p = &a;
类型为int *,变量名为p,能存储的内容为整型单元的地址,p是地址单元。
指针变量的大小:在32位平台是4个字节,64位平台是8个字节。
1个16进制位=4个二进制位,一个字节=8个二进制位 。
用来描述复杂的类型。
比如描述一个学生,有姓名,性别,年龄等等信息
struct 结构体名
{
定义成员变量1;
定义成员变量2;
};
struct stu//声明结构体类型
{
char name[20];
char sex[20];
int age[20];
};
struct stu a = { "张三","男",100 };//初始化变量a
结构体变量名.成员名
printf("%s %s %d\n", a.name, a.sex, a.age);
结构体指针->成员名
struct stu a = { "张三","男",100 };
struct stu* b = &a;
printf("%s %s %d\n", b->name, b->sex, b->age);
C语言的大门已经敞开了,这只是个开始哦。更详细的内容后续会一一搞定。
如有纰漏,请多见谅。