C语言初阶——1C语法概览

一、前言

1.C语言是什么?

  C语言是一门通用计算机编程语言,广泛应用于底层开发。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。
  尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。
  二十世纪八十年代,为了避免各开发厂商用的C语言语法产生差异,由美国国家标准局为C语言制定了一套完整的美国国家标准语法,称为ANSI C,作为C语言最初的标准。目前2011年12月8日,国际标准化组织(ISO)和国际电工委员会(IEC)发布的C11标准是C语言的第三个官方标准,也是C语言的最新标准,该标准更好的支持了汉字函数名和汉字标识符,一定程度上实现了汉字编程。
  C语言是一门面向过程的计算机编程语言,与C++,Java等面向对象的编程语言有所不同。其编译器主要有Clang、GCC、WIN-TC、SUBLIME、MSVC、Turbo C等。
(1)机器语言(二进制的指令)
(2)汇编语言(用一些简单的单词,助记符,代替二进制指令)
(3)高级语言(比汇编语言层次更高,抽象能力和表达能力更强)
eg:C、C++、JAVA、Pthon、GO(C语言原班人马打造)、易语言(中文编程,用来写外挂相当于中文版VB)、R、PHP世界上最好的语言(编写网站)、C#、JavaScript、HTLM、CSS(最后三款都是前端开发语言)

2. 为什么要学习C语言

  • 经典 :对后世的编程语言带来了深远影响
  • 简单:语法特性简洁明了
  • 底层:更贴近硬件设备和操作系统

3. 如何学习C语言

敲代码

4、VS2019使用

在这里插入图片描述
在这里插入图片描述

4.1 新建项目

菜单栏文件右键【新建】——【项目】
弹出对话框 左侧选择【Visual C++】——【空项目】
名称:“XXX_时间”
位置:这个路径最好不要带中文
创建完项目之后 创建.c文件
点击【视图】找到【解决方案资源管理器】——找到【源文件】右键【添加】——【新建项】
在这里插入图片描述
弹出对话框:创建.c文件,左侧点【Visual C++】,点击【C++文件.cpp】,在名称命名为XX.c(一定要记得改成.c后缀),点击【添加】.c文件就创建成功,可以编辑代码了。
在这里插入图片描述

4.2 创建一个holle world

printf:格式化打印
print 打印
f——formet 格式化

#include <stdio.h>

int  main()
{
	printf( "hello world!");
	return 0;
}

在这里插入图片描述

4.3 调试

【调试】——【开始执行不调试】
发现没有显示结果
在代码行中添加
添加一个 “system(“pause”);这个system是包含在头文件<stdlib.h>中”就能看见结果了~

#include <stdio.h>
#include<stdlib.h>

int  main()
{
	printf( "hello world!");
	system("pause");
	return 0;
}

小tips:shift+ alt+enter:让编辑区最大化

4.4 快捷键

  • shift + alt+ r:rename功能,批量替换。这个功能依赖一个插件VAX Visual Assist X
    针对C#来说VS是非常友好的,其他的就需要一些插件

二、C语法概览

C语言中,
=表示"赋值",把变量里填充的内容给改了.
==表示"比较相等" ,如果 == 两侧的内容相等,表达式就返回1,不相等就返回0。
1表示真(非零相当于真)
0表示假

2.1 单位换算

8bit => 1 Byte 字节
1024字节=>1KB
1024KB=>1MB
1024MB=>1GB
1024GB=>1TB
1024TB=>1PB

eg :123456789 Byte 大约120MB

1000——KB
1000,000——MB
1,000,000,000——GB
printf(“%d\n”, sizeof(char));
%d:打印一个十进制、有符号的、整数

2.2 数据类型

在这里插入图片描述

	printf("%d\n", sizeof(char));
	printf("%d\n", sizeof(short));
	printf("%d\n", sizeof(int));
	printf("%d\n", sizeof(long));
	printf("%d\n", sizeof(long long));
	printf("%d\n", sizeof(float));
	printf("%d\n", sizeof(double));

在这里插入图片描述
C语言中有很多类型,实际使用的时候,如果表示整数,优先考虑使用int,
在这里插入图片描述

数据类型代表范围(字节)代表范围(比特位)代表范围(数字)
char1个字节8个比特位-2^7 ~ 2^7-1 (-127~128也就是0 ~256 )
short2个字节16个比特位-2^ 15~ 2^15-1(-32768~32767也就是0 ~65536 )
int4个字节32个比特位-2^ 31 ~ 2^ 31-1 (-2,147,483,648~ 2,147,483,647 也就是0~4,294,967,296[42亿9千万])
long4个字节32个比特位-2^31~2 ^31-1 (-2,147,483,648~ 2,147,483,647 也就是0~4,294,967,296[42亿9千万])
long long8个字节64比特位-2^63~2 ^63-1 (0 ~18,446,744,073,709,551,616)
float4个字节32个比特位-2^31~2 ^31-1 (-2,147,483,648~ 2,147,483,647 也就是0~4,294,967,296[42亿9千万])
double8个字节64比特位-2^63~2 ^63-1 (0 ~18,446,744,073,709,551,616)

2.3 变量和常量

  • 变量的分类
    局部变量
    全局变量

  • 变量的使用
    主要分为两个
    1)读:看看这个内存里面存了什么
    2)写:给这个内存写入新的内容

  • 常量
    程序运行过程中,不能发生改变的量

  • 创建常量
    (1)用const 关键字表示
    const int num =10;
    (2)字面值常量
    10 = 20;
    (3)枚举,enum
    MAL4 =20 ;
    (4)宏
    SIZE =30;
    宏定义的语法,和变量定义差别很大
    #define 开始
    没有类型
    没有 =
    宏的名字,一般习惯上是大写(小写也行)
    最后也没有;
    宏是C语言中非常NB的语法

2.4 字符串+转义字符+注释

  1. 字符串
    这种由双引号(Double Quote)引起来的一串字符称为字符串字面值(String Literal),或者简称字符串。
    注:字符串的结束标志是一个 \0的转义字符。在计算字符串长度的时候 \0是结束标志,不算作字符串内容。

strlen 也是一个常用的库函数,功能是:获取一个字符串的长度。strlen 在#include<string.h>中
C中没有一个专门的表示“字符串”的类型。
C中的字符串,本质上是一个字符数组(凑合),如果你要表示一个长度为7的字符串,就至少需要使用一个长度为8的字符数组(多出来的位置用来存放一个特殊的字符,‘\0’来表示字符串的结尾)

	char arr1[] = "bit";
	char arr2[] = { 'b','i','t' };
	char arr3[] = { 'b','i','t','\0' };
	printf("%s\n", arr1);
	printf("%s\n", arr2);
	printf("%s\n", arr3);
  1. 转义字符
    如何在屏幕上打印字符串: c:\code\test.c\n?
	printf("c:\\code\\test.c\\n");

在这里插入图片描述

转义字符释义
?在书写连续多个问号时使用,防止他们被解析成三字字母
\‘常用于表示字符常量‘
"用于表示一个字符串内部的双引号
\用于表示一个反斜杠,防止它被解释为一个转义序列符
\a警告字符。蜂鸣
\b退格符
\f进纸符
\t水平制表符
\v垂直制表符
\dddddd表示1~3个八进制的数字,如\130X
\xdddd表示2个十六进制数字,如:X300
  1. 注释
    C语言风格的注释 /xxxxxx/
    缺陷:不能嵌套注释
    在这里插入图片描述
    C++风格的注释 //xxxxxxxx
    可以注释一行也可以注释多行

2.5 选择语句

if(表达式){
表达式值非0,就执行这个代码块的内容
}
else{
表达式为0就执行这个代码块的内容
}
else这个语句块是可以省略的,省略的时候,如果表达式为0,就无事发生。

scanf是只有vs2019可以使用的一个函数,使用的时候进行编译提示需要用一个宏,使用这个宏注意要定义在函数的最上方。
在这里插入图片描述

判断输入一个数是奇数还是偶数

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include<stdlib.h>


int main()
{
	int num = 0;
	printf("请输入一个整数:");

	//%d的含义是 十进制 有符号 的整数
	//&取地址
	scanf("%d", &num);
	printf("num = %d\n", num);

	if (num % 2 == 0)
	{
		printf("num为偶数");
	}
	else
	{
		printf("num为奇数");
	}
	printf("num = %d\n", num);
	return 0;

}

在这里插入图片描述

2.6 循环语句

while和if很像,
while(表达式){
循环体
}
表达式为真(非0)就执行循环体
表达式为假(为0)就不执行循环体

示例:让用户输入一个正整数,打印从1到该整数之间的所有数字。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include<stdlib.h>


int main()
{
	int num = 0;
	printf("请输入一个正整数:");

	scanf("%d", &num);
	
	int i = 1;
	while (i <= num)
	{
		printf("%d\n", i);
		//每次打印完,需要让i发生变化,如果i不变,会一直打印1,
		i = i + 1;
	}


	return 0;
}

在这里插入图片描述
进行循环的时候,通常要及时更新循环变量
i=i+1就是让i每次执行都变大1
i=i+1在C语言中等价于i+=1

  • 自增运算,也能起到=+1的效果:
    i++
    ++i
    没有赋值的话,上面这两个没有任何区别。
    这两个的区别在于表达式的值不一样,如果不取值的话等价。
    i++是自增之前的结果。++i是自增之后的结果
    - 循环语句的三个要素
    (1)循环变量的初始值
    (2)循环条件:控制循环什么时候开始什么时候结束
    (3)更新循环变量

2.7 函数

函数是一个可以被复用的代码片段。


int main(){

	int ret = add(1,6);
printf("%d\n", ret);
	return 0;

}
int add(int x, int y) {
	int ret = x + y;
	return ret;
}

函数被定义了没有用,只有被调用了才会执行,

2.8 数组

2.8.1 数组定义

批量创建一组相同类型的变量:C语言中要求数组中的变量是相同类型~
类似于Java、C++、Go这样的语言和C语言一致(称这类为静态类型,一个变量在运行过程中类型是固定的,不能变)
类似于Python、PHP、JavaScript、的语言不要求数组中是相同类型。(称这类为动态类型,一个变量在运行过程中类型可以改变)
在这里插入图片描述

2.8.2 数组使用

通过下标,获取到数组中的某个元素。
在这里插入图片描述
针对数组取下标,有效范围【0,length-1】
如果数组下标越界,那么就会产生“未定义行为”。

2.9 操作符

  1. 算术操作符:+、 - 、 *、 /、 %;
  2. 移位操作符: >>、 <<;
  3. 位操作符:&、 |、 ~
  4. 赋值操作符: = 、 += 、 -=、 *= 、 /= 、 &= 、 ^=、 |= 、 >>= 、 <<=
  5. 单目操作符:
单目操作符含义
逻辑反操作
-负值
+正值
&取地址
sizeof操作数的类型长度(以字节为单位)
~对一个数的二进制按位取反
前置、后置–
==前置、后置++
*间接访问操作符(解引用操作符)
(类型)强制类型转换
  1. 关系操作符:>、<=、<、<=、!=、==
  2. 逻辑操作符: && (逻辑与 )、 | | 逻辑或
  3. 条件操作符:exp1 ? exp2 : exp3
  4. 逗号表达式:exp1, exp2, exp3, …expN
  5. 下标引用、函数调用和结构成员:[ ]、()、. 、 ->

2.10 常见关键字

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

2.10.1 关键字 typedef

typedef 顾名思义是类型定义,这里可以理解为类型重命名,给类型起一个别名~
比如:

#include <stdio.h>
#include<stdlib.h>

int main() {
	//像 无符号 类型直接写起来就比较麻烦
	unsigned int a = 0;
	typedef unsigned int uint;

	uint b = 2;
	system("pause");

	return 0;
}

这里涉及到了unsigned,unsigned可以和以下类型搭配:char、short、int 、long 、long long
注意不能和float、double 搭配使用。

2.10.2关键字static

  1. 修饰局部变量,改变了这个变量的生命周期,跟随整个程序
#include <stdio.h>
#include<stdlib.h>

void print() {
	static int num = 1;
	printf("num = %d\n,num");
	num++;
}

int main() {
	print();
	print();
	print();

	system("pause");
		return 0;
}
  1. 修饰全局变量 ,修饰了一个全局变量,改变了变量的作用域,修饰了static的变量,限制其只能在当前文件中使用,其他.c文件使用不了它。
    test1.c
int global =10

test.c

#include <stdio.h>
#include<stdlib.h>

//C中函数或者变量使用之前要有申明/定义
// 其中extern 可以省略
//声明语句是不能进行初始化这样的操作
//声明相当于是一个空头支票
extern int global;
void print() {
	static int num = 1;
	printf("global = %d\n",global);
	num++;
}

int main() {
	
	printf("global = %d\n", global);
	system("pause");
		return 0;
}
  1. 修饰函数,作用和修饰全局变量一样。修饰一个函数,改变了函数的作用域,修饰了static的函数,限制其只能在当前文件中使用,其他.c文件使用不了它。
//函数声明,没有函数体,后面直接写;
//函数形参名可以不写,但是类型名必须保留
extern int add(int, int);

2.11 指针

2.11.1 内存

内存是电脑上特别重要的存储器,计算机中所有程序的运行都是在内存中进行的 。
所以为了有效的使用内存,就把内存划分成一个个小的内存单元,每个内存单元的大小是1个字节。为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地址。
指针就是一个变量,变量里面存储了一个整数,这个整数具有特定的含义,就是内存中的一个地址,
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

通过指针变量,就可以查看到指针变量里面存储的那个内存地址是啥~进一步的, 就可以根据这个内存地址找到对应的内存空间(往里面存储或者读取数据)
通过一张房卡, 就可以看到你的房间号,通过房间号找到这个房间,开]进去,就可以往里放东西,也能取出里面的东西~~
在这里插入图片描述
代码示例:

	int num = 1;
	int* p = &num;
	//打印指针内容,使用 %p  来实现
	printf("p = %p\n", p);

C语言中 * 的用法:

  1. 乘号
  2. 前面带了个类型,表示指针类型(此时的 * 和前面的类型是一个整体)
    • 后面带了个指针变量,*表示“解引用操作“ (间接访问操作) 解引用就是根据地址找到对应的内容空间,看看内存中存的值是多少。
int main() {
	
	int num = 1;
	int* p = &num;
	//打印指针内容,使用 %p  来实现
	printf("p = %p\n", p);
	printf("%d\n", *p);
	*p = 100;
	printf("%d\n", *p);

结果:
在这里插入图片描述
分析:
在这里插入图片描述
对*p进行操作就是对num直接进行操作。

2.12 结构体

结构体本质上是一个自定义类型

struct Point {
	//x, y叫做结构体的成员变量/属性/字段
	int x;
	int y;
};


int main() {
	//创建一个Point类型的变量
	//struct Point point = { 100,200 };
	typedef struct Point Point;
	Point point = { 100, 200 };

	//结构体的关键用法:成员访问 使用 .  作为成员访问操作符

	printf("%d, %d", point.x, point.y);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值