初识C语言

Posted 很冷.

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了初识C语言相关的知识,希望对你有一定的参考价值。

目录

一、变量的使用

二、变量的作用域和生命周期

三、常量的进一步了解

四、字符串

五、转义字符

六、注释

七、总结


一、变量的使用

1、 在叙述变量的使用之前先说一个C语言中的输入函数 scanf

    (1)scanf 函数是C语言提供的一个输入函数

scanf 函数的使用格式:

这里使用输入整数举例说明

  • 如果要输入两个整数,双引号中就要写两个%d,   输入n个整数就写n个%d
  • %d与%d之间可以用空格隔开,也可以用逗号隔开
  1. 用空格隔开:scanf("%d %d",&num1,&num2);
  2. 用逗号隔开:scanf("%d,%d",&num1,&num2);
  • & --->取地址,使用scanf函数输入数据时要在变量前加取地址符& 
  • 双引号引起来的内容[ "%d,%d" ]叫做格式控制符。在定义时使用什么格式,那么在输入数据的时候就要使用该格式来输入数据。
  • 例如:
  1. %d与%d之间使用空格隔开,那么在控制台中输入的两个数据之间也要用空格隔开;
  2. %d与%d之间使用逗号隔开,那么在控制台中输入的两个数据之间也要用逗号隔开;

     (2)简单说明一下在VS这个集成开发环境中使用scanf函数报错的问题

如果在VS中使用scanf函数出现报错,在给出的报错信息中有两种解决方法:

VS中使用scanf函数的报错信息:

'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

 方法一:在源文件的第一行加上  #define  _CRT_SECURE_NO_WARNINGS 1

 #define 后面的内容就显示在报错的信息中,可以直接在报错的信息中复制这段文字。后面的1是随便写的一个值,加不加都不影响使用。(建议尽量去复制 _CRT_SECURE_NO_WARNINGS这段文字,自己用键盘打出来有可能会出错

注意:#define  _CRT_SECURE_NO_WARNINGS 1 这句一定要放在代码的第一行。放在其他位置就不起作用了。

补充:每次写代码的时候都要加 #define  _CRT_SECURE_NO_WARNINGS 1 可能会比较麻烦,可以在电脑中搜索newc++file.cpp这个文件(这个文件是在你安装的VS的的路径下),搜索到这个文件以后,将这个文件拖到桌面中(文件原路径下不可以编辑修改)再进行编辑将#define  _CRT_SECURE_NO_WARNINGS 1 这句话放到这个文件中然后保存(也可以将经常用到的头文件保存在这个文件中),保存完以后再将这个文件拖回到原来的路径下,这样每次在VS中写代码的时候第一行都会默认加上这句话。

【因为此文章是讲述C语言的知识点,VS的操作内容不会详细讲述。这里只是进行了一些文字描述,如果有不清楚的地方可以百度查看一下详细的操作,也可以私信我。】

方法二:在报错的信息中提到可以使用scanf_s 来代替scanf函数(不推荐使用这种方法

scanf_s函数是vs编译器提供的一种函数,不是C语言自己的,在其他的编译器(gcc,clang......)下没有scanf_s函数,其他编译器也不认识这个函数,当你在代码中使用了scanf_s函数,你的代码在其他编译器下就没法正确的编译,这样就降低了代码的跨平台性。所以建议写代码时使用标准C提供的功能和函数。

如果好奇想使用scanf_s这个函数,一定要研究清楚它的使用方法再去使用,它的使用方法与scanf函数是有区别的,这里就不再过多的叙述。

2、变量的使用:需要变量就创建一个变量然后使用这个变量就可以了

这里给出两整数相加的例子:

//stdio.h    标准输入输出头文件
#include<stdio.h>
//scanf 是C语言提供的一个输入函数
//& --->取地址
int main()
{
	//两个整数相加
	int num1 = 0;
	int num2 = 0;
	int sum = 0;
	//输入两个值
	scanf("%d %d", &num1, &num2);
	//计算
	sum = num1 + num2;
	//输出
	printf("%d\\n", sum);
	return 0;
}

运行结果:

 也可以将sum在定义的时候直接使用:
#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;
}

这种写法在老一点的编译器中编译会报错。

C99标准之前有一个规定:变量要创建在当前代码块的最前面!

C99之后的语法中就支持了:变量在哪里使用就在哪里定义!


二、变量的作用域和生命周期

1、作用域:

作用域是程序设计概念,通常来说,一段程序代码中所用到的名字并不总是有效、可用的,而限定这个名字的可用性的代码范围就是这个名字的作用域。

  • 局部变量的作用域是变量所在的局部范围。

如果去点47行的代码,就可以输出变量b的值

 局部变量a的作用域是在外面的 { } 内

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

2、生命周期:

变量的生命周期指的是变量的创建到变量的销毁之间的一个时间段

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

作用域描述的是变量的使用范围,生命周期描述的是一个时间段。

作用域与生命周期是两个不同的概念,二者只是有关联。

我在另一篇文章中也讲述了生命周期与全局变量,有兴趣的老铁可以去看一下。

CSDN


三、常量的进一步了解

C语言中的常量分为以下以下几种:

  • 字面常量
  • const 修饰的常变量
  • #define 定义的标识符常量
  • 枚举常量

1、字面常量

直接用键盘打出来的就是字面常量:

#include<stdio.h>
int main()
{
    100;//整型常量
    3.14;//浮点类型常量
    'a';//字符常量
    "abcd";//字符串常量
    return 0;
}

2、const 修饰的常变量

一个变量没有被const修饰,那这个变量的值是可以改变的:

 一个变量被const修饰后,那这个变量的值就不可以被修改:

const的用法:

当一个变量不想被别人修改,就可以在这个变量前面加const。

虽然加上const以后变量不能被修改,但是本质上它还是一个变量。

3、#define 定义标识符常量

#define 定义的标识符常量大写小写都可以,一般习惯大写

4、枚举常量(这里只是简单了解一下,后面还会讲述)

枚举就是一一列举

  • 生活中有很多值都是可以一一列举的(比如性别:男、女、保密)
  • 有些值不适合一一的列举(比如工资)

枚举是要定义后才可以使用:

//定义枚举类型
enum Sex
{
    //枚举类型的可能取值---就是枚举常量
    MALE,
    FEMALE,
    SECRET
}; //这个;必须要加
int main()
{
    //枚举常量的使用
    enum Sex s = MALE;
    //打印枚举常量
    printf("%d\\n", MALE);
    printf("%d\\n", FEMALE);
    printf("%d\\n", SECRET);
    return 0;
}

枚举常量不可以直接修改它的值

枚举常量的默认是从0开始,依次向下递增1


四、字符串

C语言中是没有字符串类型的,在C语言中由双引号引起来的一串字符称为字符串字面值,或者简称字符串。

例如:

   "Hello World\\n"
    "abc";//字符串
    "a";//字符串
    "";//空字符串

1、字符串的定义:

    char arr1[] = "abc";
    char arr2[] = { 'a','b','c' };

2、输出字符串:

C语言中使用%s这个格式符输出字符串

3、打印字符数组

为什么这个两个字符数组打印出来的内容不一样呢?

接下来我们来看一下这两个字符数组在内存中的存储:

 从字符数组在内存中的存储可以发现arr1最后多了一个'\\0'。

字符串的末尾其实隐藏一个'\\0','\\0'是字符串的结束标志arr1在打印的时候遇到了'\\0'就结束了。而arr2是一个字符一个字符放进去的,如果不放'\\0'这个字符那么arr2是找不到结束标志的,所以arr2在打印出abc后不会停下来,直到在某个位置找到了'\\0'才会停下来,所以abc后面就输出了一些随机值(乱码)。

如果想让arr2也正常输出,只要在字符'c'后面加上'\\0'。

 我们再来看一下这两个字符数组在内存中的存储:

 由此可以得出:'\\0'对字符串是特别重要的!

 字符串的结束标志是一个 \\0 的转义字符。在计算字符串长度的时候 \\0 是结束标志,不算作字符串内容。

 4、strlen(string length)函数 :求字符串长度的函数

在使用strlen这个函数的时候要引入#include<string.h>这个头文件

#include<stdio.h>
#include<string.h>
int main()
{
	//使用strlen这个函数求字符串的长度
	int len = strlen("abc");
	printf("%d\\n", len);
	return 0;
}

运行结果:

  • 接下来使用strlen函数计算两个字符数组的长度
#include<stdio.h>
#include<string.h>
int main()
{
	//可以把字符串放在字符数组中
	char arr1[] = "abc";
	char arr2[] = { 'a','b','c' };
	//使用strlen函数计算字符数组的长度
	printf("%d\\n", strlen(arr1));
	printf("%d\\n", strlen(arr2));
	return 0;
}

运行结果:

输出结果说明:

  • arr1字符数组中的字符串末尾隐藏了一个'\\0',strlen在计算字符数组长度的时候只计算'\\0'之前的数,所以输出3。
  • arr2字符数组中是存放了3个字符,这些字符中也没有'\\0'这个字符,所以strlen在计算字符数组长度时就会输出一个随机值(这个值有可能是3,9,18......等任何值)。

在arr2字符数组中放一个'\\0'字符再输出

虽然在'\\0'字符后面又加了两个字符,但是strlen在计算字符数组长度时只计算'\\0'前面的字符!


五、转义字符

  转义字符就在转变原来的意思

转义字符释义
\\?在书写连续多个问号时使用,防止他们被解析成三字母(现在基本用不到了)
\\'用于表示字符常量'
\\"用于表示一个字符串内部的双引号
\\\\用于表示一个反斜杠,防止它被解释为一个转义序列符。
\\a用警告字符,蜂鸣
\\b退格符
\\f进纸符
\\n换行
\\r回车
\\t水平制表符
\\v垂直制表符

\\ddd

ddd表示1~3个八进制数字。例如:\\123 转换后就是S

\\xddd

dd表示2个十六进制数字。例如:\\x30转换后就是 0
#include<stdio.h>
int main()
{
	printf("hehenhehe");
	printf("\\n------------\\n");
	printf("hehe\\nhehe");
	return 0;
}

运行结果:

  \\n就是一个转义字符(\\n就是一个换行);\\0也是一个转义字符

打印一个文件路径:

输出几个转义字符看一下代码执行结果:

重点说一下 \\ddd \\xdd这里的x只能是小写)这两个转义字符

  • \\ddd,ddd表示1~3个八进制数字

\\123为什么是S呢?

\\123其实是将八进制的123转换成了十进制的83(计算过程:1*8^2+2*8^1+3*8^0=83)

83作为ASCII码值所代表的字符就是S,所以\\123会打印出S

补充:八进制是0~7,所以八进制数中最大的数是7。例如:  \\811、\\181、\\178这些都是错的

  • \\xdd,dd表示2个十六进制数字

\\x30转换后为什么是 0呢?

\\x30其实是将十六进制的30转换成了十进制的48(计算过程:3*16^1+0*16^0=48)

48作为ASCII码值所代表的字符就是0,所以\\x30会打印出0

补充:十六进制数是:0~9与a~f共同组成

再回到一开始的打印一个文件路径:

#include<stdio.h>
int main()
{
    //打印一个文件路径
    printf("E:\\\\2021_10_17\\\\test.c\\n");
    return 0;
}

运行结果:


六、注释

C语言有两种注释方式:

  1. 单行注释:  //
  2. 多行注释: /*  */
  • //  这种是C99之后引入的注释方式 ----->C++的注释风格
  • /* 这种是C99之前C语言的注释方式 ---->C语言的注释风格*/
#include<stdio.h>
int main()
{
	//int a = 10; //单行注释
	//int b = 20;
	/* 多行注释
	printf("Hello World\\n");
	printf("Hello World\\n");
	printf("Hello World\\n");
	printf("Hello World\\n");
	printf("Hello World\\n");
	printf("Hello World\\n");
	*/
	return 0;
}

补充:多行注释的缺陷是不支持嵌套注释

注释的作用:

  1. 代码比较复杂最好加上注释,时间久了有助于自己阅读代码,加上注释也有助于别人阅读你的代码。
  2. 代码暂时不用的时候,也可以注释掉。

不要过分注释,注释不要写的太过于详细!


七、总结

C语言中有许多有趣的东西,可能看着代码会觉得有些枯燥,看到一大堆文字会看不下去。

编程的学习在于多动手多写代码这样才会有所收获。

一开始写代码肯定会出现很多的问题,只有不断的出错不断地改错自己才会进步。

以上是关于初识C语言的主要内容,如果未能解决你的问题,请参考以下文章

初识C语言<2>

C语言代码片段

C语言初学者之初识代码专项练习

初识c语言

初识Python

初识C语言