文章目录
前言
👧个人主页:@小沈YO.
😚小编介绍:欢迎来到我的乱七八糟小星球🌝
📋专栏:C语言次列车ing
🔑本章内容:数据类型、变量+常量、字符串+转义字符+注释
记得 评论📝 +点赞👍 +收藏😽 +关注💞哦~
提示:以下是本篇文章正文内容,下面案例可供参考
一、什么是C语言
C语言是一门通用计算机编程语言,广泛应用于底层开发。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。
尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。
二十世纪八十年代,为了避免各开发厂商用的C语言语法产生差异,由美国国家标准局为C语言制定了一套完整的美国国家标准语法,称为ANSI C,作为C语言最初的标准。 [1] 目前2011年12月8日,国际标准化组织(ISO)和国际电工委员会(IEC)发布的C11标准是C语言的第三个官方标准,也是C语言的最新标准,该标准更好的支持了汉字函数名和汉字标识符,一定程度上实现了汉字编程。
C语言是一门面向过程的计算机编程语言,与C++,Java等面向对象的编程语言有所不同。
其编译器主要有Clang、GCC、WIN-TC、SUBLIME、MSVC、Turbo C等。
C语言中有哪些单位?
byte - 字节 | 1 byte=8 bit |
---|---|
KB | 1 KB=1024 byte |
MB | 1 MB=1024 KB |
GB | 1 GB=1024 MB |
TB | 1 TB=1024 GB |
PB | 1 PB=1024 TB |
bit | 比特位 |
二、第一个C语言程序
c
stdio.h 标准输入输出头文件
#include<stdio.h>
//C语言的代码都是main函数的第一行开始执行的
main函数是程序的入口 --- 但是有且仅有一个
int main()
{
printf("hello world\n");
//printf是一个库函数---C语言的标准库中提供的一个现成的函数
//功能:在屏幕上打印信息
//输出函数,打印函数,使用前一定要包含头文件stdio.h
return 0;
}
三、数据类型
char (字符数据类型) | %c用来输出字符,char型;%s用来输出字符串,通常用来输出char型 |
---|---|
short (短整型) | %d |
int (整形) | %d整型输出,通常用来输出int型 |
long (长整型) | %ld长整型输出,通常用来输出long型 |
long long (更长的整形) | %lld更长整形输出,通常用来输出long long 型 |
float (单精度浮点数) | %f用来输出小数,通常用来输出float型 |
double (双精度浮点数) | %lf是双精度浮点型,通常用来输出double型 |
- 为什么出现这么的类型和研究它的大小?
- 存在这么多的类型,其实是为了更加丰富的表达生活中的各种值。
类型的使用:
c
注意:字符必须要单引号引起来
char ch = 'w';
double weight = 120.0;
int salary = 20000;
- 假设有一个数字20想要将它存到内存中,那应该申请多大空间呢?
首先20是一个整形,申请一个int 类型的空间就可以了,只要申请4个字节的空间把它放进去就可以啦也就是为什么研究类型大小
- 每种类型的大小是多少?
c
#include<stdio.h>
int main()
{
sizeof - 运算符(操作符)
单位字节
printf("%d\n", sizeof(char));
printf("%d\n", sizeof(short));
printf("%d\n", sizeof(int));
C语言标准:sizeof(long)>=sizeof(int)
printf("%d\n", sizeof(long));
printf("%d\n", sizeof(long long));
printf("%d\n", sizeof(float));
printf("%d\n", sizeof(double));
return 0;
}
四、变量、常量
生活中的有些值是不变的(比如:圆周率,性别,身份证号码,血型等等)
有些值是可变的(比如:年龄,体重,薪资)
不变的值,C语言中用常量的概念来表示,变得值C语言中用变量来表示。
- 定义变量的方法
c
#include<stdio.h>
int main()
{
int num = 20;
char ch = "b";
float weight = 45.5f;
编译器默认认为一个小数就是double所以可以在末尾加个f
return 0;
}
#include<stdio.h>
int main()
{
int num = 10;
printf("%d\n", num);
num = 20;
printf("%d\n", num);
return 0;
通过下述图片可以主观的看到num是可变的是一个变量
}
2. 变量的命名
- 只能由字母(包括大写和小写)、数字和下划线( _ )组成
- 不能以数字开头
- 长度不能超过63个字符
- 变量名中区分大小写的(Num和num是不一样的)
- 变量名不能使用关键字
- 变量名最好有意义(比如年龄:int age)
- 变量的分类
变量是有分类的:
- 局部变量:在{}内部定义的变量就是局部变量
- 全局变量:在{}外部定义的变量就是全局变量
🌟局部变量
c
#include<stdio.h>
int main()
{
int a = 10;//限制在main函数内部是一个局部变量
printf("%d\n", num);
return 0;
}
🌟全局变量
c
int num = 100;//全局变量
#include<stdio.h>
int main()
{
printf("%d\n", num);
return 0;
}
🌟局部变量与全局变量的易错点
c
int a = 1000;
#include<stdio.h>
int main()
{
int a = 10;
//int a = 20;//同一个范围内出现两个局部变量就会冲突
printf("%d\n", a);全局变量和局部变量的名字可以相同但是在使用时局部变量优先
所以下述打印出来是10而不是1000
return 0;
}
🌟变量的使用
c
计算两个数值相加
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int num1 = 0;//创建了两个变量
int num2 = 0;
//scanf 是一个输入函数
scanf("%d %d", &num1, &num2);
int sum = 0;
sum = num1 + num2;
printf("%d\n", sum);
return 0;
}
4. 变量的作用域和声明周期
🌟作用域
作用域(scope)是程序设计概念,通常来说,一段程序代码中所用到的名字并不总是有效/可用
的而限定这个名字的可用性的代码范围就是这个名字的作用域。
- 局部变量的作用域是变量所在的局部范围。
cpp
#include<stdio.h>
void test()
{
printf("%d\n", a);
}
int main()
{
int a = 10;
printf("%d\n", a);
{
int b = 20;//b在{ }内部,它的作用域就是{ }内部,出了作用域就不可以用了
printf("%d\n", b);
}
printf("%d\n", b);
return 0;
}
- 全局变量的作用域是整个工程
c
#include<stdio.h>
int a = 100;
void test()
{
printf("2: %d\n", a);
}
int main()
{
printf("1: %d\n", a);
test();
return 0;
}
//声明外部符号
extern int g_val;
#include<stdio.h>
int main()
{
printf("%d\n", g_val);
return 0;
}
这也证明了全局变量是不安全的因为使用的范围比较广谁都可以用,也就代表潜在危险大
extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。此外extern也可用来进行链接指定。
🌟生命周期
变量的生命周期指的是变量的创建到变量的销毁之间的一个时间段
- 局部变量的生命周期是:进入作用域生命周期开始,出作用域生命周期结束。
c
#include<stdio.h>
int main()
{
{
int a = 10;
printf("%d\n", a);
}
printf("%d\n", a);
return 0;
}
- 全局变量的生命周期是:整个程序的生命周期。
c
#include<stdio.h>
int a = 10;
void test()
{
printf("%d\n", a);
}
int main()
{
//...
test();
return 0;
}
- 常量
C语言中的常量和变量的定义的形式有所差异。
C语言中的常量分为以下以下几种:
- 字面常量
c
#include<stdio.h>
int main()
{
字面常量
100;整形字面值
"w";字符字面值
3.14;浮点型字面值
"abcdef";字符串常量
return 0;
}
- const 修饰的常变量
c
#include<stdio.h>
int main()
{
const 是常属性不能被改变
const int num = 10; num本质上是个变量,但是具有了常属性不能被修改
printf("%d\n", num);
//num = 20;
不能被改变了
printf("%d\n", num);
怎么证明num本质上还是个变量呢?
用数组试验一下:
//const int n = 10;
//int arr[n] = { 0 };
n虽然被const修饰具有了常属性不能被修改但本质上还是变量不能用来指定数组大小
int arr[10] = { 0 };
下述代码在支持C99的编译器上是可以编译的,C99中引入了变长数组的概念
变长数组的大小是可以使用变量来指定的,但是数据不能初始化
//int n = 10;
//int arr[n];
return 0;
}
- #define 定义的标识符常量(不是常变量)
c
#define MAX 1000
#include<stdio.h>
int main()
{
#define MIN 200
printf("%d\n", MAX);
printf("%d\n", MIN);
int arr[MAX];
return 0;
}
- 枚举常量
c
enum Sex
{
下面三个符号是Sex这个枚举类型的未来的可能取值
MALE=5, 赋初始值
FEMALE=8, 不赋值就是上面递增1
SECRET 不赋值就是上面递增1
};
int main()
{
enum Sex s=FEMALE;
//默认取值
printf("%d\n", MALE); 1
printf("%d\n", FEMALE);2
printf("%d\n", SECRET);3
//MALE=5;
枚举常量不能被改
return 0;
}
五、字符串+转义字符+注释
- 字符串
c
"hello world.\n"
这种由双引号(Double Quote)引起来的一串字符称为字符串字面值(String Literal),或者简称字符串。
注:字符串的结束标志是一个 \0 的转义字符。在计算字符串长度的时候 \0 是结束标志,不算作字符串内容
c
#include<stdio.h>
int main()
{
C语言表示字符用单引号引起来例如:'a' 'w' '1'
多个字符组成的一串字符称为字符串
C语言表示字符串由双引号引起啦例如:"abcdef" "www"
"abc" ---> a b c \0 其中\0作为这个字符串的结束标志
char ch1 = 'a';
char ch2 = 'b';
//字符数组
char arr[]括号里没有指定大小是因为给它赋值初始化了,大小就不用指定了,编译器会根据初始化内容确认数组的大小
char arr1[] = "abc";
arr1里面放了四个字符 a b c \0
char arr2[] = { 'a','b','c' };
arr2里面只放了三个字符 a b c
return 0;
}
🌟那如何验证\0是字符串的结束标志呢
c
#include<stdio.h>
int main()
{
char arr1[] = "abc";
char arr2[] = { 'a','b','c' };
%s --- 打印字符串,直到\0才终止打印
%c --- 打印字符
printf("%s\n", arr1);
printf("%s\n", arr2);
return 0;
}
用%s打印arr1的时候遇到\0,而\0是字符串的结束标志,然后就不打印了,所以打印的是abc;但是arr2中放的abc没有\0,没有结束标志,所以用%s打印的时候就会依次往后找,找到\0这个结束标志打印停止,但是后面是什么我们根本不知道,所以打印的是随机值
c
#include<stdio.h>
int main()
{
char arr1[] = "abc";
char arr2[] = { 'a','b','c' };
当主动放进去一个\0就不会出现arr2的情况
char arr3[] = { 'a','b','c','\0' };
printf("%s\n", arr1);
printf("%s\n", arr2);
printf("%s\n", arr3);
return 0;
}
🌟补充一个知识点:strlen是一个库函数,专门用来求字符串长度(统计的是\0之前出现的字符的个数),使用时要包含头文件#include<string.h>
c
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[] = "abc";
char arr2[] = { 'a','b','c' };
char arr3[] = { 'a','b','c','\0' };
printf("%s\n", arr1);
printf("%s\n", arr2);
printf("%s\n", arr3);
printf("%d\n", strlen(arr1));
printf("%d\n", strlen(arr2));
printf("%d\n", strlen(arr3));
char len = strlen("abcdef");
strlen 在求字符串长度的时候,统计的是\0之前出现的字符的个数
printf("%d\n", len);
return 0;
}
2. 转义字符
转义字符 | 释义 |
---|---|
\? | 在书写连续多个问号时使用,防止他们被解析成三字母词 |
\' | 用于表示字符常量' |
\" | 用于表示一个字符串内部的双引号 |
\\ | 用于表示一个反斜杠,防止它被解释为一个转义序列符。 |
\0 | 字符串的结束标志 |
\a | 警告字符,蜂鸣 |
\b | 退格符 |
\f | 进纸符 |
\n | 换行 |
\r | 回车 |
\t | 水平制表符 |
\v | 垂直制表符 |
\ddd | ddd表示1~3个八进制的数字。 如: \130 X |
\xdd | dd表示2个十六进制数字。 如: \x30 0 |
c
程序输出什么?
#include <stdio.h>
int main()
{
printf("%d\n", strlen("abcdef"));
\62被解析成一个转义字符
\ddd, ddd表示1~3个八进制的数字(0~7没有8)
printf("%d\n", strlen("c:\test\628\test.c"));
\628中有8说明不是八进制的数字
return 0;
}
3. 注释
- 代码中有不需要的代码可以直接删除,也可以注释掉
- 代码中有些代码比较难懂,可以加一下注释文字
注释有两种风格:
- C语言风格的注释 /xxxxxx /
缺陷:不能嵌套注释 - C++风格的注释 //xxxxxxxx
可以注释一行也可以注释多行
c
#include <stdio.h>
int Add(int x, int y)
{
return x+y;
}
/*C语言风格注释
int Sub(int x, int y)
{
return x-y;
}
*/
int main()
{
//C++注释风格
//int a = 10;
//调用Add函数,完成加法
printf("%d\n", Add(1, 2));
return 0;
}