初识C语言小结
1.数据类型
C语言的数据类型包括以下三种:
-
整数型
-
浮点型
-
字符
整数型
整数型中有:int,short,long,long long
1.short:只含有2个字节字节,搭配%d打印short的返回值
2.int:编译器中默认整形,含有4个字节,搭配%d打印int的返回值
3.long:含有4个或8个字节(根据操作系统决定),搭配%ld打印long的返回值
4:long long:含有8个字节,搭配%lld打印long long的返回值
-
验证方法:
#include<stdio.h> int main() { printf("%zu\n",sizeof(short)); printf("%zu\n",sizeof(int)); printf("%zu\n",sizeof(long)); printf("%zu\n",sizeof(long long));//sizeof是专门用于测试数据类型字节长度的一种操作符,一般使用%zu打印sizeof的返回值,有些编译器中支持%d打印sizeof的返回值 return 0; }
-
[字节] 字节是计算机内存中的一种基本单位,也写作byte,计算机内存单位还有bit,kb,mb,gb,tb,pb.之间的换算关系为:1byte=8bit,1kb=1024byte,1mb=1024kb,1gb=1024mb,1tb=1024gb,1pb=1024tb
### 浮点型
浮点型中含有:float,double
1.float:含有4个字节,搭配%f打印float的返回值,用来表示单精度浮点数
2.double:编译器中默认浮点型,含有8个字节,搭配%lf打印double的返回值,用来表示双精度浮点数
-
验证方法:
#include<stdio.h> int main() { printf("%zu\n", sizeof(float)); printf("%zu\n", sizeof(double)); return 0; }
### 字符型
字符型中含有:char
char:含有一个字节,搭配%c打印char的返回值,能够打印出字符
```
#include<stdio.h>
int main()
{
char a='w';
printf("%c\n",a);
return 0;
}
```
结果:
验证方法:
include<stdio.h>
int main()
{
printf("%zu\n",sizeof(char));
return 0;
}
2.变量和常量
变量
变量包括了:
- 局部变量
- 全局变量
局部变量:指的是在一定范围内有效的变量
但提到变量那就得提到变量的作用域和生命周期
用白话来讲就是变量所能应用的范围和其活动的一次时间
实例:
而b的生命周期就是程序运行时从第二个注释符旁的大括号到第三个注释符旁的大括号的过程
而a的生命周期近似于主函数运行开始到结束的过程
全局变量:指的是在同一个头文件中都能进行使用的变量
实例:
在此处,a就是全局变量
那么有人就会问:那不在同一源文件也行吗?
答案时肯定的,但要做一点变化,否则会出现下面的情况
这时候需要我们帮助它进行一次声明,这时候就需要用到extern
通过extern对编译器进行声明,让这个源文件知道另一个源文件中存在着这么一个东西
常量
常量的简单介绍
常量在数学中就是不会发生改变数值的量叫做常量,在编程中也是如此,在编程过程中,一个不会发生变化的量就是常量,与之相对的就是变量
常量包括3种:
- 字面常量
- const修饰的常变量
- define定义的标识符常量
- 枚举常量
字面常量
字面常量就像字面上写的那样,从字面上就是常量,例如:3(整数),2.1(小数),'a'(字符),"abcd"(字符串)
const修饰的常变量
首先,我们必须知道什么是常变量?
常变量就是拥有常量性质的变量
int num=1
const int num=1
这两者的区别就是一个是变量,一个是近似于常量的变量
#include<stdio.h>
int main()
{
int num1=1;
num1=2;//这就是变量,可以随意改变自己的大小
const int num2=1;
num2=2;//若执行此操作,编译器就会提示表达式必须是可修改的左值
return 0;
}
由此可见一个变量被const修饰后便有了常量的性质,但其本质还是变量
我们可以这样理解:变量是在一个无限大的范围中的某个值,只要允许可以变为任意值,而常量是一个实打实的固定值,无法发生改变,const相当于一个钉子,当我们用const对变量进行修饰时,就是为其钉上了一个钉子,无法移动,这也是为什么常变量拥有常量的性质的原因
define定义的标识符常量
我们对于一个标识符通常可以采用 #define去定义成为一个常量,例如:
#define PI 3.14
这就将PI定义为3.14,在之后的代码中都能通过PI去代表3.14这个值
枚举常量
enum sex
{
male;//0
female;//1
secert;//2
}
由上面的例子可知,枚举中每一个类别都有一个相应的数字,这就是其也为常量的原因
3.字符串
有部分人看到[]中为7或许会感到奇怪,明明这个字符串只有6个字符,为什么会有7个呢?
那是因为在最后还藏了一个 "\0" ,这是字符串的结束标志,假如没有它可能会出现这种情况
这是因为后面没有"\0"导致字符串一直往后走,知道遇见了"\0"才结束,从侧面可知到"\0"在字符串中起到一个结束的标志
当然我们也可以对字符串的长度进行测试
但是这里测量的字符串长度没有上面的"7",这是为什么呢?
这是因为编程运行时,碰到"\0"就已经结束了,不需要继续往下运行了,所以字符串长度只有"6"(字节)
4.转义字符
这张表解释的比较清楚,所以就挑几个讲
1."\n"
"\n" 在编程中使用的最为频繁,其作用换行,可以使输出结果更美观,不会显得那么乱
2."\0"
"\0"在字符串中非常重要,可以使打印停止
3."\ddd""\xhh"
"\ddd""\xhh"这两个放一起讲
这两个都主要是要注意它们的范围,因为ASCII也有一个范围,超出其范围使用那边失去了意义
以及在笔试题中要注意"\ddd"是八进制的,数字是0~7,不存在8这个数字
担心一部分人不知道16进制的组成,我也顺便聊一下:16进制是由09,af组成的,a代表10,b代表11,以此类推
4. " " "
在编译器中使用的都是英文的双引号,当你想打印双引号时会将前面两个归于一起,从而导致无法打印出来,这时候就需要我们手动加入"",去让编译器知道你的想法,从而将其打印出来," ' "情况大同小异,便不再赘述
5.选择语句和循环语句
1.选择语句
选择语句包括了:if (else),switch
- if
if的使用
1.直接使用if
#include<stdio.h>
int main()//比较a和b的大小,但只有b较大时才输出
{
int a = 1;
int b = 2;
if(a<b)
{
printf("%d\n",b);
}
return 0;
}
2.if else语句使用
#include<stdio.h>
int main()//比较a和b的大小,输出较大值
{
int a=1,b=2;
if(a>=b)
{
printf("%d\n",a);
}
else
{
printf("%d\n",b);
}
return 0;
}
3.if else的多选择使用
#include<stdio.h>
int main()//输出一个数学函数
{
int a;
scanf("%d",&a);
if(a<0)
{
printf("-1\n");
}
else if(a==0)//这一步==是要判断a的值
{
printf("0\n");
}
else
{
printf("1\n");
}
return 0;
}
当然还有别的写法:
#include<stdio.h>
int main()
{
int a;
scanf("%d",&a);
if(a<0)
{
printf("-1\n");
}
else
{
if(a=0)
{
printf("0\n");
}
else
{
printf("1\n");
}
}
return 0;
}
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;
case 4://星期四
printf("去开会\n")
break;
case 5://星期五
printf("约同学去聚餐\n")
break;
case 6://星期六
printf("做家务,整理房间\n")
break;
case 7://星期天
printf("去图书馆学习\n")
break;
default://输出1~7之外的数字
printf("输入错误,请重新输入\n")
break;
}
return 0;
}
2.循环语句
循环语句存在以下3种形式:
-
while
-
for
-
do......while
- while的使用
#include<stdio.h>
int main()//一名编程新手通过努力获得一份好offer
{
int i = 0;
while(i<10)//循环,一直努力
{
printf("%d,仍需努力\n",i);
i++;
}
if(i>=10)//熬出头了
{
printf("获得一份好offer");
}
return 0;
}
- for的使用
#include<stdio.h>
int main()//与上面一样
{
for(int i=0;;i++)
{
if(i<10)
{
printf("%d,仍需努力\n",i);
}
else
{
printf("得到一份好offer\n");
break;
}
}
return 0;
}
6.函数
简单的相加函数:
通常我们相加会选择下面的方法:
#include<stdio.h>
int main()
{
int a,b;
scanf("%d %d",&a,&b);
int sum=a+b;//a,b总和
printf("%d\n",sum);
return 0;
}
但当这样的相加求和数量上来后,这种方法便不太实用了,所以这时候会选择函数
#include<stdio.h>
int Add(int x,int y)//这一步选择int作为数据类型,是因为下面需要返回且返回值是整数,倘若下面无需返回,便可以直接选择void作为数据类型
{
//int z=x+y;
//return z;//常规可以这样,但还能进行一次简化
return (x+y);//可以不需要z变量,使函数更简便
}
int main()
{
int a,b;
scanf("%d %d",&a,&b);
int sum=Add(a,b);//这一步利用函数来进行相加
printf("%d\n",sum);
return 0;
}
7.数组
数组中每一个字符都存在一个相应的编码
并且由上述可知,编码是从0开始的
8.typedef和static
(1).typedef
typedef的主要作用是可以为一些操作命名或为一些名词命名
#include<stdio.h>
int main()
{
typedef unsigned int unint;//这样便将unsigned int 命名为unint,之后便可以直接写unint,节省时间
unint a = 1;
return 0;
}
(2).static
解释其用法之前,我们得先知道,电脑编译运行时,内存含有:
- 栈区
- 堆区
- 静态区
通常编译时,主要以栈区为主,但当我们使用static时,便能将一个步骤拉入静态区,之后便不会在起作用
使用前
使用后
9.指针
在计算机中,存在内存的概念,内存其实也分成了许多份,当我们的代码运行的时候,就会占取一部分内存,关键的是,每一份内存都有自己的编码,例如:当我们定义了一个int a=1时,便会按顺序占取内存中的4个字节,此时其的地址也便称为指针,若此时我们用一个变量去记录这个指针,那么,我们就会得到一个指针变量
在上面的代码中,i保存的是a地址,而具有解引用的作用,所以i相当于a,所以我们也可以通过改变*i来改变a