初始C语言

前言

C语言是一门面向过程计算机编程语言,与C++Java面向对象编程语言有所不同。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、仅产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。C语言描述问题比汇编语言迅速、工作量小、可读性好、易于调试、修改和移植,而代码质量汇编语言相当。C语言一般只比汇编语言代码生成的目标程序效率低10%-20%。因此,C语言可以编写系统软件。- 取自百度
C语言是一门面向过程的计算机编程语言,与C++,Java等面向对象的编程语言有所不同,C语言广泛应用于底层开发中。

写一个C语言程序

#include<stdio.h>
//stdio: standard input and output标椎输入输出
int main()
{
    printf("hello hexiongzhen!");
    //printf是打印库函数,需要头文件stdio.h
    return 0; //函数执行完返回一个整形0,与前面的int呼应
}
//main函数是程序执行的入口,有且只有一个

一、数据类型

char			//字符型
short			//短整型
int 			//整形
long			//长整型
long long 		//更长的整形
float			//单精度浮点型
double 			//双精度浮点型

C语言中每个类型的大小有多大?

#include<stdio.h>
int main()
{
    //sizeof可以求类型的大小
	printf("%d\n", sizeof(char));			1
	printf("%d\n", sizeof(short));			2  
	printf("%d\n", sizeof(int));			4
	printf("%d\n", sizeof(long));			4/8
	printf("%d\n", sizeof(long long));		8
	printf("%d\n", sizeof(float));			4
	printf("%d\n", sizeof(double));			8
	return 0;
}

注意:C语言规定sizeof(long) >= sizeof(int), 所以long的大小是4/8个字节,不同编译器结果可能不一样。


二、变量和变量

变量

生活中一些量是变化的,例如身高、体重和年龄等,而C语言则用变量的概念表示,C语言中变量分为局部变量和全局变量。

#include<stdio.h>
int g_val = 22;
//g_val在函数外部定义的变量是全局变量
int main()
{
	//变量的定义
	int a = 19;
	char ch = 'a';
	float f = 2.5;
	//a, ch, f在函数内部(代码块{})里面定义的变量就是局部变量
	return 0;
}

作用域

int g_val = 100;//在其他代码块访问都有效
int main()
{
	{
		int a = 10;
		printf("%d\n", a);//a只在这个代码块内有效
	}
	printf("%d\n", a);//会报错,因为此时a变量空间已被释放
}
作用域:指变量能被正常访问的代码区域,限定这个变量可用性的代码范围就是这个变量的作用域。
局部变量的作用域是这个变量所在的局部范围,只在本代码块内有效。
全局变量的作用域是整个工程,程序运行期间都有效。

生命周期

生命周期:指变量从定义到释放的这个时间范围
局部变量的生命周期:进入作用域生命周期开始,出作用域生命周期结束
全局变量的生命周期:整个程序的生命周期

常量

生活中有些值是不变的,例如性别、血型、身份证号码等,而C语言用常量的概念表示,常量的定义分为一下四种:

  1. 字面常量
  2. const修饰的常变量
  3. #define定义的标识符常量
  4. 枚举常量
#include<stdio.h>
#define N 10
//define定义的标识符常量
enum Colour
{
	RED,
	YELLOW,
	BLUE
};
//枚举关键字enum,里面RED,YELLOW,BLUE是枚举常量
int main()
{
	19;//这些写出来数字就是字面常量
	const int a = 20;//const修饰的常变量,使其具有常属性
	a = 10;//不能改,const修饰a,a具有常属性,但a本质上还是变量
	int arr[a] = { 0 };//数组元素个数只能是常量,而a是常变量,所有不能作为数组元素个数
	return 0;
}

三、字符串和转义字符

字符串

"hello hexiongzhen!"

这些由双引号引起的字符称为字符串字面值,简称字符串。

注意:字符串的结束标志是’\0’转义字符。

#include<stdio.h>
int main()
{
	char arr1[] = "hello";
	//字符串后面默认有个\0作为结束标志
	char arr2[] = { 'h', 'e', 'l', 'l', 'o' };
	//因为arr2数组后面没有\0,%s打印的时候会越界访问,继续向后面打印,直到遇到\0才停止,所有打印的是随机值
	char arr3[] = { 'h', 'e', 'l', 'l', 'o', '\0' };
	//遇到\0作为结束标志停止打印,和arr1打印一样
	printf("%s\n", arr1);
	printf("%s\n", arr2);
	printf("%s\n", arr3);

}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vq1y7PUR-1627458129910)(C:\Users\hxz50\Desktop\QQ截图20210718082916.png)]

转义字符

转义字符通常来说,就是转变意思,下面介绍一些转义字符。

转义字符释义
\?在书写连续多个问号时使用,防止他们被解析成三字母词
\ ’用于表示字符常量’
\“用于表示一个字符串内部的双引号
\ \用于表示一个反斜杠,防止他被解释为一个转义序列符
\a警告字符,蜂鸣
\b退格符
\f进纸符
\n换行
\r回车
\t水平制表符,相当于tab
\v垂直制表符
\dddddd表示1~3个八进制的数字。如:\130化成十进制为88,作为ASCII值表示字符X
\Xdddd表示2个十六进制数字。如:\x30表示0

注释

  1. 代码中有不需要的代码可以直接删除,也可以注释掉
  2. 代码中有些代码比较难懂,可以加一下注释文字
int Add1(int x, int y)
{
	return x + y;
}
/* C语言注释风格
int Add2(int x, int y)
{
	int z = x + y;
	return z;
}
*/
int main()
{
	int a = 10;
	int b = 20;
	int ret = Add1(a, b);
	//int ret = Add2(a, b);
	//C++注释风格
	printf("a + b = %d\n", ret);
}

注释有两种风格:

  • C语言风格注释 / * xxxx * /, 不能嵌套注释
  • C++风格注释:/ / *********,可以注释一行也可以注释多行,推荐使用

四、选择和循环语句

选择语句

如果你在大学期间好好学习编程,毕业就会拿到好offer,从此走上人生巅峰。

如果你在大学期间不好好学习编程,毕业就是失业,回家种田吧。

int main()
{
	int input = 0;
	printf("你在大学会好好学习编程吗?:> (选择1or0)\n");
	scanf("%d", &input);
	if (1 == input)
	{
		printf("你毕业会拿到好offer\n");
	}
	else if (0 == input)
	{
		printf("少年,回家种田吧!\n");
	}
	else
	{
		printf("选择错误,回家种田!\n");
	}
	return 0;
}
//这就是选择!

循环语句

顾名思义就是不停做事,直到满足某种条件停下来,C语言循环语句主要有while、do-while和for循环语句来实现循环结构。先简单写一个while,后面会详细讲。

#include<stdio.h>
int main()
{
	int day = 0;
	while (day <= 1600)
	{
		printf("大学坚持每天都要敲代码!%d\n", day);
		day++;
	}
	if (day > 1600)
	{
		printf("毕业拿到好offer!");
	}
	return 0;
}

五、函数和数组

函数

#include<stdio.h>
//int是函数的返回类型,Sub是函数名,x、y是函数的参数
int Sub(int x, int y)
{
	return x - y;
}
int main()
{
	int num1 = 29;
	int num2 = 10;
	int num = Sub(num1, num2);
    //Sub就是一个函数
	printf("%d\n", num);
	return 0;
}

数组

数组的下标:C语言规定数组每个元素都有一个下标,数组可以通过下标访问元素,下标是从0开始的。

int arr[5] = {0};定义一个整形数组,有五个元素,初始化为0,下标是0~4;

int arr[5]00000
下标01234

数组打印

int main()
{
	int i = 0;
	int arr[5] = { 1, 2, 3, 4, 5 };
	for (i = 0; i < 5; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

六、操作符

算术操作符+ - * / %

#include<stdio.h>
int main()
{
    int a = 10;
    int b = 9;
    printf("%d\n", a+b);
    printf("%d\n", a-b);
    printf("%d\n", a*b);
    printf("%d\n", a%b);
    //注意:如果操作符两边都是整形,则进行整形运算,如果有一边是浮点型(小数),则进行小数运算,运算结果是double类型的
    //%:取模、去余的意思,两边必须是整形
    return 0;
}

移位操作符>> <<

#include<stdiol.h>
int main()
{
	//<<左移操作符,按二进制位进行左移
	int a = 1;
    //a是整形-4个字节-32个bit位
	//a:的二进制:00000000000000000000000000000001
	int b = a << 2;
	//b: a向左移动两位变成00000000000000000000000000000100
    //转化为十进制为4
	printf("%d\n", b);
	return 0;
}

位操作符& ^ |

#include<stdio.h>
int main()
{
    //&:按位(二进制)与,对应的二进制位有0则为0,两个为1才是1
    //^:按位(二进制)或,对应的二进制位有1则为1,两个为0才是0
    //|:按位(二进制)异或,对应的二进制位相同为0,相异为1
    int a = 4;
    int b = 5;
    int c = a & b;
    int d = a | b;
    int e = a ^ b;
    // a :00000000000000000000000000000100
    // b :00000000000000000000000000000101
    //a&b:00000000000000000000000000000100
    //a|b:00000000000000000000000000000101
    //a^b:00000000000000000000000000000001
    printf("%d\n", c);// 结果为4
    printf("%d\n", d);// 结果为5
    printf("%d\n", e);// 结果为1
}

赋值操作符: *= += -= = /= &= ^= |= >>= <<=

int main(){    int a = 10;    a += 9;//相当于a = a +9,其它的也一样    return 0;}

单目操作符

概念操作符
逻辑反操作
整值+
负值-
取地址&
操作符的类型长度(以字节为单位)sizeof
对一个数的二进制按位取反~
前置、后置–(--a先减减再使用、a–先使用再减减)
前置、后置++(++a先加加再使用、a++先使用再加加)++
间接访问操作符(解引用操作符)*
强制类型转换(类型)
int main()
{
	//!:逻辑反操作,把真变假,把假变真
	//C语言中0表示真,非0表示假
	int a = 1;
	if (a)
	{
		//判断条件a为非0,表示真,打印haha
		printf("haha\n");
	}
	if (!a)
	{
		//判断条件!a为0,表示假假,不打印hehe
		printf("hehe\n");
	}

	//~:对一个数二进制按位取反,1变0,0变1
	int b = ~1;
	//整形在内存中存储的是补码
	//00000000000000000000000000000001 - 原码
	//11111111111111111111111111111110 - 补码 ~1按位取反
	//11111111111111111111111111111101 - 反码
	//10000000000000000000000000000010 - 原码
	printf("%d\n", b);
	//结果是-2
	return 0;
}

关系操作符> >= < <= !=(用于测试“不相等”) ==(用于测试“相等”)

逻辑操作符&& ||

int main()
{
	//&& :	逻辑(二进制)与,相当于并且的意思
	//|| :	逻辑或,相当于或者的意思
	int a = 19;
	if (a > 0 && a < 18)
	//条件两边都成立,才为真,一边为假结果为假
		printf("未成年\n");
	if (a < 10 || a > 18)
	//条件一边成立则为真,两边为假结果为假
		printf("haha\n");
	return 0;
}

条件操作符:exp1 ? exp2 : exp3

int Max(int x, int y)
{
	return x > y ? x : y;
	//条件1为真,表达式结果为条件2,条件1为假,表达式结果为条件3
	//if (x > y)
	//	return x;
	//else
	//	return y;
}
int main()
{
	int a = 10;
	int b = 19;
	int max = Max(a, b);
	printf("%d\n", max);
	return 0;
}

逗号表达式:exp1,exp2,exp3,……expn

从左到右依次运算,表示式最后的结果是整个逗号表达式的结果

下标引用、函数调用和结构成员:[ ] ( ) . ->


七、常见关键字

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

先介绍一个关键字:static-静态

修饰局部变量-延长局部变量的生命周期
在这里插入图片描述
在这里插入图片描述

修饰全局变量-缩短全局变量的作用域,使得这个全局变量只能在本源文件使用,不能在其他源文件使用。

修饰函数-使得这个函数只能在本源文件使用,不能在其他源文件使用。


八、指针

内存是电脑上的存储器,内存被划分成一个个小小的内存单元,每个内存单元的大小是一个字节,都有一个编号,这些编号就是一个地址,指针是用来存放地址的,那地址怎么产生呢?

例如:在32位机器上,有32根地址线/数据线,通电会产生正电和负电,然后电信号转换成数字信号,产生32个0或1序列的bit位,有232个地址。

int main()
{
    //创建一个a变量,占内存4个字节
    int a = 10;
    //&a:取地址符号,把a的地址取出来
    //pa:是一个指针变量,用来存放地址
    int* pa = &a;
    //*pa:指针变量前面的*叫解引用操作符,可以通过解引用找到a的空间
    //改变a的值变成20
    *pa = 20;
}

内存如下:
在这里插入图片描述

指针大小

int main()
{
	printf("%d\n", sizeof(char*));
	printf("%d\n", sizeof(short*));
	printf("%d\n", sizeof(int*));
	printf("%d\n", sizeof(long*));
	printf("%d\n", sizeof(float*));
	printf("%d\n", sizeof(double*));
	return 0;
}

总结:指针存放地址,而地址的大小在32位是4个字节,在64位是8个字节。


九、结构体

结构体让C语言可以描述一些复杂类型,如学生的名字、性别、年龄的描述。

struct Student//结构体类型
{
	//结构体成员
	char name[10];
	char sex[10];
	int age;
};
int main()
{
	//定义结构体变量s
	struct Student s = { "小何", "男", 19 };
	struct Student* ps = &s;
	//打印成员信息
	printf("%s %s %d\n", s.name, s.sex, s.age);
	printf("%s %s %d\n", ps->name, ps->sex, ps->age);

	return 0;
}

我是一位在编程上摸爬滚打的C语言小白
山水万程,未来可期!给个三连行不行!
觉得可以点个赞吧,哈哈哈,加油~
注意:本篇内容可能有一些问题,欢迎大家告诉我!

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

那年盛夏繁如花

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值