系列文章目录
C语言学习入门第一节初识C语言(上)
C语言学习入门第一节————初识C语言(下)
初识C语言
什么是C语言
数据类型
变量、常量
字符串+转义字符+注释
选择语句
循环语句
函数
数组
操作符
常见关键字
define 定义常量和宏
指针
结构体
一、什么是C语言?
语言是用来沟通的一种工具
汉语、英语、日语等则是人和人交流的语言
C/C++/Java…上千种计算机语言是人和计算机交流的计算机语言
C语言是人和计算机交流的一种计算机语言
C语言是一门通用计算机编程语言,广泛应用于底层开发。C语言的设计目标是提供一种能以简易的方式编译,处理低级存储器,产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。
底层开发:
底层开发
C语言是一门面向过程的计算机编程语言,与C++,Java等面向对象的编程语言有所不同。
其编译器主要有Clang、GCC、WIN-TC、SUBLIME、MSVC、Turbo C等。
二、数据类型
名称 | 数据类型 |
---|---|
char | 字符数据类型 |
short | 短整形 |
int | 整形 |
long | 长整形 |
long long | 更长的整形 |
float | 单精度浮点数 |
double | 双精度浮点数 |
为什么会出现这么多种类型? 每种类型的大小是多少?
计算机中的单位:
bit ,byte——字节
1byte = 8bit
KB 1KB = 1024byte
MB 1MB = 1024KB
GB 1GB = 1024MB
TB 1TB = 1024GB
PB 1PB = 1024TB
1.各类型的大小
代码如下(示例):
//sizeof 是一个操作符,是计算机类型/变量所占内存空间的大小
//
//%d - 以10进制的形式打印一个整数
//
#include<stdio.h>
int main()
{
printf("%d\n", sizeof(char)); //char --> 占 1 个字节
printf("%d\n", sizeof(short)); //short --> 占 2 个字节
printf("%d\n", sizeof(int)); //int --> 占 4 个字节
printf("%d\n", sizeof(long)); //long --> 占 4 个字节
printf("%d\n", sizeof(long long)); //long long --> 占 8 个字节
printf("%d\n", sizeof(float)); //float --> 占 4 个字节
printf("%d\n", sizeof(double)); //double --> 占 8 个字节
return 0;
}
[C语言标准规定:sizeof(long) >= sizeof(int)]
数据类型的用途 --> 创建变量(开辟空间,数据类型的大小决定开辟空间的大小)
三、变量,常量
生活中的有些值是不变的–> 圆周率、性别、身份证号码、血型等等
有些值是可变的–> 年龄、体重、薪资等等
不变的值,C语言中用常量的概念来表示。
变的值,C语言中用变量来表示。
1.定义变量的方法
代码如下(示例):
#include <stdio.h>
int main()
{
//类型 变量名;
//类型 变量名 = 初始值;
int age1; //只初始化了,未赋值
int age2 = 18; //初始化顺便赋值
//55.5 这个小数直接写出来,编译器自动默认是double类型的
//55.5f 这个时候就是float类型
float weight1 = 55.5f;
double weight2 = 88.5;
return 0;
2.变量的命名( * * * )
规则:
(1)只能由字母(包括大写和小写)、数字和下划线(_ )组成。
(2)不能以数字开头。
(3)长度不能超过63个字符。
(4)变量名中区分大小写的。
(5)变量名不能使用关键字。
建议: 变量名要起的有意义
3.变量的分类( * * )
局部变量
全局变量
首先原则上我们的变量名尽量不要冲突 ,但是当全局变变量和局部变量的名字冲突的情况下,局部优先的
代码如下(示例):
#include <stdio.h>
//首先原则上我们的变量名尽量不要冲突
//但是当全局变变量和局部变量的名字冲突的情况下,局部优先的
int a = 100;//全局变量
int main()
{
int b = 10;//局部变量(放在大括号内部的)
printf("a=%d\n", a);
return 0;
}
4.变量的使用
代码如下(示例):
#include <stdio.h>
int main()
{
//写一个代码,求2个整数的和
int num = 0;
int num2 = 0;
int sum = 0;
//输入2个整数的值
//&num - 取出num的地址
//& 取地址操作符
scanf("%d %d", &num, &num2);//400 86
sum = num + num2;
//打印
printf("%d\n", sum);
return 0;
}
%c - 字符类型
%d - 整型
%s - 字符串
%f - float类型
%lf - double类型
%p - 地址的打印
5.变量的作用域和生命周期( * * * )
作用域:
作用域(scope)是程序设计概念,通常来说,一段程序代码中所用到的名字并不总是有效/
可用
的而限定这个名字的可用性的代码范围就是这个名字的作用域。
(一个变量在哪里可以使用哪里就是它的作用域)
- 局部变量的作用域是变量所在的局部范围。
- 全局变量的作用域是整个工程。
局部变量:
代码如下(示例):
#include <stdio.h>
int main()
{
{
int a = 5;//局部变量a:作用域为a所在的{}内
printf("%d\n", a);//结果:打印5
}
//printf("%d\n", a);//不在a的作用域时:系统报错 -“系统找不到指定文件”; 报错 -"未定义标识符'a'"
return 0;
}
全局变量:
代码如下(示例):
int a = 2023;//全局变量:语法允许的情况下,任何情况下都可以使用
//在大括号外定义的变量:全局变量
//在大括号内定义的变量:局部变量
void test()//void: 不返回数据
{
printf("2---> %d\n", a);
}
int main()
{
printf("1---> %d\n", a);
test();//调用上面写的函数
return 0;//结果1:打印“1---> 2023”,可以调用主函数外的a
} //结果2:1---> 2023
//2---> 2023(调用方法后)
代码如下(示例):
//使用add.c文件里的全局变量
int g_val = 2023;
//使用add.c文件里的全局变量
extern int g_val;//(extern: 外部符号)
int main()
{
printf("%d\n", g_val);
return 0;//结果:2023,语法允许的情况下,全局变量任何情况下都可以使用
}
生命周期:
变量的生命周期指的是变量的创建到变量的销毁之间的一个时间段
- 局部变量的生命周期是:进入作用域生命周期开始,出作用域生命周期结束。
- 全局变量的生命周期是:整个程序的生命周期。
局部变量:
代码如下(示例):
//生命周期(局部变量)
#include <stdio.h>
int main()//进入主函数
{
{//进入作用域内,生命周期开始
int a = 3;//创建变量
int b = 5;//创建变量 //变量创建的本质:是在内存中开辟一块空间存放数据
int c = 0 ; //创建变量
c = a + b;//使用变量
printf("%d\n", c);
}
//退出作用域,生命周期结束 //销毁:把空间还给操作
return 0;
}
全局变量:
代码如下(示例):
#include<stdio.h>
//在主函数的范围内全局变量都能使用
//全局变量的生命周期就是整个程序的生命周期
int a = 10;
int main()
{ //进入作用域内,程序开始,全局变量的生命周期开始
int b = 5;//创建变量
int c = 0 ; //创建变量 //变量创建的本质:是在内存中开辟一块空间存放数据
c = a + b;//使用变量
printf("%d\n", c);
return 0;
}
//退出作用域,程序结束,全局变量的生命周期结束。
6.常量
语言中的常量分为以下以下几种:
(1)字面常量
(2)const 修饰的常变量
(3)#define 定义的标识符常量
(4)枚举常量
字面常量:
例如
3.1415
const 修饰的常变量:
#include <stdio.h>
int main()
{
const int a = 3; //const: 赋予变量常属性(不能修改的属性)
//这里的a是具有常属性的,不能改变,但是本质上还是变量
printf("%d\n", a);
a = 10;//赋予a常属性后再修改a会报错
printf("%d\n", a);
return 0;
}
#include <stdio.h>
int main()
{
//数组
// int n = 10;
// int arr[n];//报错:创建数组时[]中需要填常量
const int n = 10;
int arr[n];
//报错:创建数组时[]中需要填常量,这里使用被const修饰的n填入,结果还是报错
//说明n本质还是变量,只是不能修改而已(常变量)
return 0;
}
#include<stdio.h>
//在主函数的范围内全局变量都能使用
//全局变量的生命周期就是整个程序的生命周期
int a = 10;
int main()
{
return 0;
}
#define定义的标识符常量:
#include <stdio.h>
#define SIZE 10//#define 定义标识符常量
#define SIZE 10
#define MAX 10000
#define CH 'W'
int main()
{
//10;
int a = SIZE;
int arr[SIZE] = {0};
printf("%c", CH);
return 0;
}
枚举常量:
枚举 - 一一列举
生活中有些值是可以一一列举
性别:男、女、保密
三原色:red green blue
血型:A B AB O
//
enum SEX
{
//列出了枚举类型enum SEX的可能取值
//枚举常量
MALE=4,
FEMALE=6,
SECRET=9,
Bloodtype = 'O'
};
int main()
{
enum SEX s = FEMALE;
printf("%d\n", MALE);
printf("%d\n", FEMALE);
printf("%d\n", SECRET);
printf("%c\n", Bloodtype);
return 0;
}
四、字符串、转义字符、注释
1.字符串
"hello bit.\n"
这种由双引号(Double Quote)引起来的一串字符称为字符串字面值(String Literal),或者简称字符串。
注:字符串的结束标志是一个\0的转义字符。在计算字符串长度的时候\0是结束标志,不算字符串内容
#include <stdio.h>
int main()
{
//"abcdef";
//char ch1 = 'a';
//char ch2 = 'b';
//char ch3 = 'c';
char ch[] = {'a', 'b', 'c', 'd', 'e', 'f'};
char ch2[] = "abcdef";
//在字符串的末尾隐藏一个\0,这个\0是字符串的结束标志
printf("%s\n", ch);
printf("%s\n", ch2);
return 0;
}
注:printf 以%S打印字符串的时候就从你给的地址开始打印,一直打印到遇到/0时停止
#include <stdio.h>
#include <string.h>
int main()
{
char ch1[] = { 'a','b','c' };//[a][b][c]
char ch2[] = "abc"; //[a][b][c][\0]
int len1 = strlen(ch1);
//strlen()方法:求字符串长度,
//从给定的地址,向后数字符,直到遇到\0结束,\0不统计在内
printf("%d\n", len1);
int len2 = strlen(ch2);
printf("%d\n", len2);
}
2.转义字符( * * * )
转义字符顾名思义就是转变意思
转义字符 意义
\? 在书写连续多个问号时使用,防止它们被解析为三字母次
\' 用于表示字符常量'
\" 用于表示一个字符串内部的双引号
\\ 用于表示一个反斜杠,防止它被解释为一个转义序列符
\a 警告字符,蜂鸣
\b 退格符
\f 进纸符
\n 换行
\r 回车
\t 水平制表符
\v 垂直制表符
\ddd d d d表示1-3个八进制的数字,如:\130 表示 字符X
\xdd d d 表示2个十六进制数字,如:\x30 表示字符0
转移字符:
int main()
{
printf("%c\n", 'a');
printf("%c\n", 'x');
printf("%c\n", '\''); // \' 用于表示字符常量'
printf("%s\n", "abc");
printf("%s\n", "a");
printf("%s\n", "\""); // \“ 用于表示一个字符串内部的双引号
printf("a\\tb"); // \\ 用于表示一个反斜杠,防止它被解释为一个转义序列符
printf("\a"); // \a 警告字符,蜂鸣
printf("abcdef\n"); //打印结果abcdef
printf("abc\bdef\n"); //打印结果abdef //\b:退格符,这里\b后面的d退到
//了c的位置
return 0;
}
\ddd 和 \xdd:
#include <stdio.h>
// \ddd
int main()
{
printf("%c",'\130');//8进制的130,转换成10进制-->88-->对应ASCII表的 X
//130
//1*8的2次方 3*8的1次方 0*8的0次方
//64 + 24 + 0 = 130
return 0;
}
#include <stdio.h>
int main()
{
printf("%c\n", '\x31');//16进制的31,转换成10进制-->49-->对应ASCII表的 1
//31
//3*16的1次方 1*16的0次方
//48 + 1 = 49
return 0;
}
三字母词:
#include <stdio.h>
int main()
{
printf("(are you ok??)");
//在有些编译器会打印成”are you ok]“
// "??)" 这三个字符会被认为是三字母词 打印时变成 "]"
//在 ??) 三个字符前分别加上转义字符就可以打印 ??)了
printf("(are you ok\?\?\)");
return 0;
}
打印一个目录: c:\code\test.c
#include <stdio.h>
int main()
{
//打印文件路径:
printf("c:\code\test.c\n");
//打印结果:code est.c
//正确方法:在 \t(水平制表符) 前加上 \ ,转义掉转义字符
printf("c:\code\\test.c");
return 0;
}
求c:\test\x11\328\test.c的字符串长度
#include <stdio.h>
#include <string.h>//使用跟字符串有关的函数时使用该头文件
int main()
{
printf("%d\n", strlen("c:\test\x11\328\test.c"));
// \t \x11\32 \t 是转义字符占一个字节
//结果为15
return 0;
}
3.注释
1.代码中有不需要的代码可以直接删除,也可以注释掉
2.代码中有些代码比较难懂,可以加一下注释文字
注释有两种风格:
C语言风格的注释 /*xxxxxx*/
缺陷:不能嵌套注释
C++风格的注释 //xxxxxxxx
可以注释一行也可以注释多行
#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;
}
五、选择语句
如果你好好学习,校招时拿一个好工作。
如果你不学习,毕业等于失业,进厂打螺丝。
这就是选择
1.if语句
#include <stdio.h>
int main()
{
printf("你愿意好好学习吗?(否——> 0)\n:");
int flag = 0;
scanf("%d",&flag);
//if选择语句
if (flag == 1)
printf("好工作\n");
else if (flag == 0)
printf("进厂打螺丝\n");
return 0;
}
2.switch语句(后面学):
六、循环语句
有些事必须一直做,每天吃饭睡觉,比如我们日复一日的学习
1.while语句:
#include <stdio.h>
int main()
{
int line = 0;
while (line < 50000)
{
printf("敲代码: %d\n", line);
line++;
}
if (line == 50000)
printf("好工作\n");
else
printf("进厂打螺丝\n");
return 0;
}
多组输入
//scanf函数返回的是读取到数据的个数
//如果scanf函数读取失败会返回EOF
//EOF end of file 文件结束标志
//#define EOF -1
//输入 CTRL + z 结束循环(vis中要输入三次)
int main() {
int iq = 0;
int eq = 0;
//输入
while (scanf("%d", &iq) == 1)
{
if (iq >= 140)
printf("Genius\n");
else printf("oridinary people\n");
}
return 0;
}
2.for语句(后面学)
3.do … while语句(后面学)