初识C语言(一)

目录

本章目标:

了解C语言的基础知识,对C语言有一个大概的认识。 每个知识点就是简单认识,不做过分详细讲解,后面会详细讲解。

本章重点内容如下:

  • 什么是C语言
  • 第一个C语言程序
  • 数据类型
  • 变量、常量
  • 字符串+转义字符+注释
  • 选择语句
  • 循环语句
  • 函数
  • 数组
  • 操作符
  • 常见关键字
  • define 定义常量和宏
  • 指针
  • 结构体

什么是C语言

C语言是一门计算机语言。
什么是计算机原因?
中国人交流用汉语,英国人交流用英语,人和计算机用什么交流?
初识C语言(一)
我们直接在电脑上打印:print hello,它能理解并且打印hello吗?答案是不能。计算机只能识别机器码(0,1)所以我们和计算机怎么交流呢?—计算机语言,计算机能理解的语言,比如:C/C++/PYTHON/JAVA等。

计算机语言的发展史:
计算机是硬件,电路组成,只有高低电平(0/1),对于0,1组成的一串内容,我们是看不懂的,怎么办?使用一些助记符,比如ADD等,由此出现了汇编语言,后来又出现了B语言,C,C++等高级语言。

机器语言----->汇编语言----->高级语言

第一个C语言程序

1. 创建工程/新建项目
创建项目后,解决方案资源管理器 可能出现在页面的右边,我们可以自己更改资源管理器的停靠位置,鼠标左键点中解决方案资源管理器,拖动,屏幕上会出现如下画面,拖拽资源管理器时,你会看到这几个箭头,红圈内的图标就代表停靠在左边。想放在哪边就把鼠标箭头拖动到对应的位置
初识C语言(一)
2.创建文件
.c 源文件
.h 头文件 head
3.写代码

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>//包含一个叫stdio.h的文件
//std:standard  标准  i:input   o:output

//int---整型
//main前面的int表示main函数调用返回一个整型
int main() {
//main函数----主函数--程序的入口  
//main函数必须要有 并且在一个项目中main函数有且只有一个
	printf("hehe\n");
	//printf:print function 打印函数
	//printf:库函数   c语言本身提供给我们的函数
	//别人的东西---要使用必须要跟人家打招呼   #include <stdio.h>  
	return 0;//返回0
}
//void main()这种写法已经过时了 

4.运行代码
在VS2013下,如果运行代码控制台出现一闪而过的问题,解决办法:
项目属性----->配置属性----->链接器----->系统---->子系统------>选择控制台。
初识C语言(一)
快捷键:运行代码ctrl+F5 / Fn+ctrl+F5

这里强调一下:main函数在C语言中是程序的入口,有且仅有一个

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

void test()
{
	printf("this is test function\n");
}
//test();//报错  main函数是程序的入口

数据类型

C语言有哪些数据类型?
//Char         字符类型
//Short(int)   短整型    
//int          整型
//long         长整型
//long long    更长的整型
//float        单精度浮点型
//double       双精度浮点型
//。。。。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

int main()
{
	//char   字符类型
	char ch = 'A';//在内存中开辟一块空间,存放字符A
	printf("%c\n",ch);//%c---打印字符格式的数据

	int age = 20;
	printf("%d\n",age);//%d -- 打印整型十进制数据

	//%d   打印十进制整型
	//%c   打印字符
	//%f   打印浮点数
	//%p   以地址的形式打印
	//%x   打印十六进制
	//%o   打印八进制
	//%lf  打印双精度浮点数
	float f = 3.0;
	printf("%f\n",f);
	printf("%.2f\n",f);//小数点后保留两位

	double d = 3.14;
	printf("%lf\n",d);

	return 0;
}

为什么要有这么多类型?为什么要有这么多整型?

  1. 为了表达生活中各种类型的值
    比如年龄使用整型比较合适,身高、体重使用浮点型比较合适,性别使用字符型比较合适
  2. 选择合适的数据类型,节约内存空间,提高内存利用率
    比如年龄,没有人可以活到200岁,那么使用char类型(占用1个字节内存空间,范围是0-255)就可以满足条件了,没有必要使用占用内存更多的数据类型,这样就可以节省内存空间。

那么不同的数据类型占用多大的内存空间呢?
首先介绍计算机中的单位:
bit:比特位 ,计算机最小单位 ,存储一个二进制位
Byte:字节 ,计算机的最小存储单元 ,一个字节存放8个比特位
KB = 1024B
MB = 1024KB
GB = 1024MB
TB = 1024GB
PB = 1024TB

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main() 
{
	printf("%d\n",sizeof(char));//1byte
	printf("%d\n",sizeof(short));//2
	printf("%d\n",sizeof(int));//4
	printf("%d\n",sizeof(long));//4  or  8
	printf("%d\n",sizeof(long long));//8
	printf("%d\n",sizeof(float));//4
	printf("%d\n",sizeof(double));//8
	//sizeof----操作符 计算变量/类型的大小,单位是字节
	//C语言标准规定:sizeof(long) >= sizeof(int)
	//所以在不同的编译器下sizeof(long)的值是不一样的
	//只要sizeof(long)>=sizeof(int)即可
	//32位机器是4,64位机器是8
	return 0;
}
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

int main()
{
	short age = 20;//向内存申请2个字节=16bit,用来存放20
	float weight = 48.5;
	//编译时候可能会有警告 double到float进行截断,会有精度的丢失
	//48.5默认是double类型

	float weight = 48.5f;//表示48.5是float类型 
	return 0;
}

变量、常量

生活中有可能会变化的量,也有不会变化的量。
不会变化的量 - 常量
变化的量 - 变量
定义变量的方法

//类型  变量名;
int age= 28;
char sex = 'w';
float weight = 48.5;

局部变量、全局变量

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int num1 = 30;//全局变量 - 定义在代码块({})之外的变量
int main()
{
	//int num2 = 10;//局部变量 - 定义在代码块({})之内的变量
	int num1 = 10;
	printf("%d\n",num1);//值是多少?  10
	return 0;
}

总结:
局部变量和全局变量可以同时存在 ,当局部变量和全局变量的名字相同时,在函数内部优先使用局部变量
建议:局部变量和全局变量名字不要相同 - 容易产生误会,产生bug

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	//计算两个数字的和
	int num1 = 0;//向内存申请4个字节的空间
	int num2 = 0;
	int sum = 0;
	//输入数据 - 使用输入函数scanf
	scanf("%d%d",&num1,&num2);
	//&取地址符号,把两个数字分别放进两个地址中
	
	sum = num1 + num2;
	printf("sum = %d\n",sum);
	return 0;
}

典型错误:
语法错误:缺少“;”(在“类型”的前面)
C语言语法规定:变量定义要在当前代码块的开头部分,
所以要把所有的变量声明放在最前面
貌似C99之后就没有这个问题了~

变量的作用域和生命周期
作用域
通常来说,一段程序代码中所用到的名字并不总是有效/可用的,而限定这个名字的可用性的代码范围就是这个名字的作用域。

简单来说就是:局部变量的作用域是在它所在的{}内部,出了这个{},就找不到这个变量了

全局变量的作用域是整个工程

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int global = 100;//全局变量作用域:整个工程,任何地方都可以使用

void test()
{
	printf("%d\n",global);//100;
}

int main()
{
	int num = 30;//局部变量
	//变量的作用域
	{
		int age = 10;//变量age的作用域就在这个{}中
		printf("%d\n",num);//30
	}	
	//printf("%d\n",age);//报错  找不到age这个变量

	printf("%d\n",num);//30
	printf("%d\n",global);//100
	return 0;
}

全局变量的作用域是整个工程,也就是在一个源文件中声明的变量,在其他源文件中可以使用,但是怎么使用呢?使用extern

//test.c
#define _CRT_SECURE_NO_WARNINGS 1
int g_val = 2021;
//main.c
#include <stdio.h>
//使用extern来声明外部符号
extern g_val;//使用test.c中声明的变量g_val
int main()
{
	//未声明的标志符	
	printf("%d\n",g_val);

	return 0;
}

生命周期

1.局部变量的生命周期:进入作用域开始,出作用域结束;
2.全局变量的生命周期:整个程序的生命周期。

关于scanf函数使用的问题:

#include <stdio.h>
int main()
{
	int num1 = 0;
	int num2 = 0;
	scanf("%d%d",&num1,&num2);
	int sum = num1 + num2;
	printf("%d\n",sum);
	return 0;
}

这段代码会报如下错误:
初识C语言(一)
scanf函数是C语言提供的,scanf_s不是标准C语言提供的,是VS编译器提供的,scanf_s尽量不要使用,当代码移植时,其他编译器是不认识scanf_s函数的,代码的可移植性差

怎么解决?
在源文件开头,使用define定义常量 :
#define _CRT_SECURE_NO_WARNINGS 1
但是每次手动添加该常量较为麻烦,找到VS编译器安装路径下的newc++file.cpp文件,写入#define _CRT_SECURE_NO_WARNINGS 1,若文件无法修改,复制出来一份,以记事本方式打开,写入#define _CRT_SECURE_NO_WARNINGS 1,保存后,覆盖原来的newc++file.cpp文件,以后每次添加源文件,会自动添加(或者以管理员身份打开vs,然后打开newc++file.cpp,写入#define _CRT_SECURE_NO_WARNINGS 1)。

上一篇:python接口自动化36-忽略警告Warning


下一篇:C4996 'fopen': This function or variable may be unsafe.