C语言的初步

一、什么是C语言

        在了解什么是C语言之前,我们要先了解什么是语言。语言就是人们用于沟通和表达思想、感情、意愿和知识的一种符号系统。人与人交流有自然语言,如:汉语,日语,英语。

        那人和计算机是怎么交流的呢?那当然是使用计算机语言啦!

        目前已知的计算机语言有上千种,人们通过编写计算机程序,给计算机下达指令,让计算机根据人们的意愿进行工作的。而C语言就是者上千种语言的一种,属于计算机语言。

        C语⾔是⼀⻔编译型计算机语⾔,C语⾔源代码都是⽂本⽂件,⽂本⽂件本⾝⽆法执⾏,必须通过编译 器翻译和链接器的链接,⽣成⼆进制的可执⾏⽂件,可执⾏⽂件才能执⾏。

        C语⾔代码是放在 .c 为后缀的⽂件中的,要得到最终运⾏的可执⾏程序,中间要经过编译和链接2个 过程。

        注: 1. 每个源⽂件(.c)单独经过编译器处理⽣成对应的⽬标⽂件(.obj为后缀的⽂件) 2. 多个⽬标⽂件和库⽂件经过链接器处理⽣成对应的可执⾏程序(.exe⽂件)

二、集成开发环境

        集成开发环境(IDE)⽤于提供程序开发环境的应⽤程序,⼀般包括代码编辑器、 编译器 、 调试器 和 图形⽤⼾界⾯ 等⼯具。 集成了代码编写功能、分析功能、编译功能、调试功能等⼀体化的开发软件服务套。

        在市面上也有较多的集成开发环境,比如VS2022,XCode,DevC++等等,建议使用VS2022的社区版作为学习的工具,不仅免费,使用方面,而且工作常见。

        作为一个强大的集成开发环境,它包含了编辑器+编译器+调试器,功能强大,并且默认界面是中文的,对初学者较为友好!

三、源文件和头文件

        源文件通常包含程序的实现代码,即函数和类的定义。在C语言中,源文件的扩展名通常是.c。

源文件的作用

  1. 实现功能:源文件包含函数和类的具体实现代码。这些代码会被编译成机器码,然后与其他编译后的源文件链接在一起,生成可执行文件或库。

  2. 管理代码复杂性:通过将代码分成多个源文件,可以将复杂的程序分解为更小、更易于管理的部分。每个源文件可以专注于实现一个特定的功能或模块。

  3. 提高编译效率:当源文件更改时,只需要重新编译更改的文件,而不是整个程序。这可以显著提高大型项目的编译速度。

  4. 代码重用:源文件可以被多个项目共享和重用。通过将通用的代码放在单独的源文件中,可以创建库,这些库可以在不同的项目中使用,减少了代码冗余。

        头文件包含程序的声明,如函数原型、宏定义、类型定义和类声明等。头文件的扩展名通常是.h.hpp(对于C++)。头文件的作用是让源文件知道其他文件中定义了什么,以便正确地使用这些定义。

        

头文件的作用

  1. 声明共享接口:头文件通常包含函数原型、宏定义、结构体声明、类声明等,这些声明可以被多个源文件共享。通过包含头文件,源文件可以知道如何使用其他文件中定义的函数和类。

  2. 避免重复编译:头文件中的内容通常只在编译时需要,不需要在每个源文件中都重复编写。通过预处理器指令如#ifndef#define, 和 #endif,可以确保头文件的内容只被编译一次,即使它被多个源文件包含。

  3. 封装和模块化:头文件允许程序员将相关的声明放在一起,这有助于封装和模块化代码。其他源文件只需包含相应的头文件,就可以使用这些声明,而不需要关心其具体实现。

  4. 接口和实现的分离:头文件通常只包含接口声明,而不包含实现。这有助于分离代码的接口和实现,使得代码更加清晰,也便于维护和更新。

四、main函数

        每个 C 语⾔程序不管有多少⾏代码,都是从 main 函数开始执⾏的, main 函数是程序的⼊⼝, main 函数也被叫做:主函数。

        main 前⾯的 int 表⽰ main 函数执⾏结束的时候返回⼀个整型类 型的值。

        所以在 main 函数的最后写 return 0; 正好前后呼应。

        • main函数是程序的⼊⼝

        • main函数有且仅有⼀个

        • 即使⼀个项⽬中有多个.c⽂件,但是只能有⼀个main函数(因为程序的⼊⼝只能有⼀个)

五、printf函数和库函数

        

printf("hello world\n");

        在上述代码中,使用了一个printf函数,这将实现在屏幕中信息的打印,他的运行结果是输出一个“hello world”。

        这里简单介绍一下printf,printf是一个库函数,他的功能是在标准输出设备上进行信息的打印。上面的代码是使用printf函数打印字符串,只要将想要打印的一串字符放在双引号中并传递给printf函数就可以打印。

int n = 100;
printf("%d\n", n); //printf打印整型
printf("%c\n", 'q'); //printf打印字符
printf("%lf\n", 3.14); //printf打印双精度浮点型

        printf也可以打印其他类型的数据,在上方,这里的%d,%c等是占位符,会被后边的值替换掉但是在使用这个printf函数的时候,需要包含一个头文件,打个比方,我想要调用printf的使用权限,但是这个创造者是对应的头函数,那么我该怎么调用呢,其实并不复杂,跟头文件申请调用就好了,这一步相当于在最开始输入一个#include<stdio.h>,就是跟头函数打了声招呼,告诉它我想要使用这个库函数。

        那什么是库函数呢?

        为了不再重复实现常⻅的代码,让程序员提升开发效率,C语⾔标准规定了⼀组函数,这些函数再由不 同的编译器⼚商根据标准进⾏实现,提供给程序员使⽤。这些函数组成了⼀个函数库,被称为标准 库,这些函数也被称为库函数。在这个基础上⼀些编译器⼚商可能会额外扩展提供部分函数(这些函 数其他编译器不⼀定⽀持)。 ⼀个系列的库函数⼀般会声明在同⼀个头⽂件中,所以库函数的使⽤,要包含对应的头⽂件。

六、关键字介绍

C语⾔中有⼀批保留的名字的符号,⽐如: int 、 if 、 return ,这些符号被称为保留字或者关键 字。

需要注意的是

• 关键字都有特殊的意义,是保留给C语⾔使⽤的

• 程序员⾃⼰在创建标识符的时候是不能和关键字重复的

• 关键字也是不能⾃⼰创建的

下方是一些比较常用的关键字:

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 

七、字符和ASCII编码

        在键盘上可以敲出各种字符,如:a,q,@,#等,这些符号都被称为字符,C语⾔中字符是⽤单引号 括起来的,如:'a','b','@'。

        我们知道在计算机中所有的数据都是以⼆进制的形式存储的,那这些字符在内存中分别以什么样的⼆ 进制存储的呢?如果我们每个⼈⾃⼰给这些字符中的每个字符编⼀个⼆进制序列,这个叫做编码,为 了⽅便⼤家相互通信,不造成混乱,后来美国国家标准学会(ANSI)出台了⼀个标准 ASCII 编码,C 语⾔中的字符就遵循了 ASCII 编码的⽅式。

该编码表如下

        该编码表中的值不需要全部记忆,只需要留意其中的常用值即可:

         •字符A~Z的ASCII码值从65~90       

         • 字符a~z的ASCII码值从97~122

        • 对应的⼤⼩写字符(a和A)的ASCII码值的差值是32

        • 数字字符0~9的ASCII码值从48~57

         • 换⾏ \n 的ASCII值是:10

        特别留意的是,在ASCII码值中从0-31这32个字符是不可打印字符,无法打印在屏幕上观察

        单个字符的打印:

#include <stdio.h>
int main()
{
 printf("%c\n", 'Q');
 printf("%c\n", 81);//这⾥的81是字符Q的ASCII码值,也是可以正常打印的
 return 0;
}
1

八、字符与字符串

        在前面的代码中,我们能看到字符是用单引号进行编写的,如'a','s','d'。但如果我想表示一串字符呢,这时候就用到了字符串格式的代码编写,举个例子:printf("asdfghjkl\n");他的运行结果是在屏幕上打印出asdfghjkl,在这里呢我可以看到,字符和字符串分别采用单引号和双引号进行编写的。

        另外,字符串的打印格式可以使⽤ %s 来指定,也可以直接打印如下:

#include <stdio.h>
int main()
{
 printf("%s\n", "hello world");
 printf("hello world");
 return 0;
}

        在这里有一个需要注意的点,就是在字符串的末尾隐藏放着⼀个 \0 字符,这个 \0 字符是字符串的结束标志。

       当我们没有在字符后面加上\0会怎样呢?我们不妨看看下面代码

#include <stdio.h>
int main()
{
	char arr1[] = { 'a', 'b', 'c' };//arr1数组中存放3个字符
	char arr2[] = "abc"; //arr2数组中存放字符串
	printf("%s\n", arr1);
	printf("%s\n", arr2);

	return 0;
}

它的运行结果如下:

        我们可以看到, arr1 字符数组在打印的时候,打印了 a 、 b 、 c 后还打印了⼀些随机值,这就是 因为 arr1 在末尾的地⽅没有 \0 字符作为结束标志,在打印的时候没有停⽌。 但是 arr2 的打印就是完全正常的,就是因为 arr2 数组是使⽤字符串常量初始化的,数组中有 \0 作为技术标志,打印可以正常停⽌。

        但是当我们打入一个\0又会怎么样呢?不妨来看看。

#include <stdio.h>
int main()
{
 char arr1[] = {'a', 'b', 'c', '\0'};
 char arr2[] = "abc";
 printf("%s\n", arr1);
 printf("%s\n", arr2);
 printf("%s\n", "abc\0def");
 return 0;
}

        如此,我们就能够较为清晰地了解到\0的作用了,在这里它起到了一个结束的作用,但是可能有一些友友就会说,字符串会不会有类似的情况呢?

        我们不如来调试一下以下代码

        通过监视功能,我们发现=总共有六个字符,最后一个居然是\0,也就是说,在C语言中,打印字符串时会自动加上\0表示结束。

九、scanf函数

        在前面,我们已经熟练的使用printf函数的打印,但是如果面对这样一个情景,阁下又该如何应对呢。

        情景:我想让系统帮我计算一个数的平方,但是这个数是由我去定义的

        这时候,scanf来了,请看一下代码

#include <stdio.h>

int main() {
    int number;

    printf("请输入一个整数:");
    scanf("%d", &number);

    printf("您输入的整数的平方是:%d\n", number * number);

    return 0;
}

        在这个程序中,我们首先声明了一个整型变量number。然后,我们使用printf函数提示用户输入一个整数。接着,我们使用scanf函数读取用户输入的整数,并将其存储在number变量中。%dscanf的格式说明符,用于读取一个整数。

        用户输入整数后,程序会计算这个整数的平方,并使用printf函数打印出来。最后,程序返回0,表示正常退出。

        请注意,使用scanf时,你需要提供变量的地址,这就是为什么我们在&number前面加上取地址运算符&的原因。

  scanf函数在C语言中具有重要的地位,它是非常实用的函数之一,用于处理程序与用户之间的交互。以下是关于scanf函数的一些重要性和实用性的说明:

  1. 用户输入scanf允许程序从用户那里获取输入,这使得C语言程序能够实现交互性,例如,可以让用户输入数据,然后程序根据这些数据进行处理。

  2. 格式化输入scanf可以按照指定的格式读取输入,支持多种数据类型,如整数、浮点数、字符和字符串。这使得它能够灵活地处理不同类型的输入数据。

  3. 控制输入scanf提供了控制输入格式的手段,例如,可以指定输入字段宽度、跳过某些字符等,这有助于处理复杂的输入模式。

  4. 安全性:虽然scanf在处理输入时可能存在一些安全问题(如缓冲区溢出),但正确使用它可以避免这些问题,并且C语言提供了更安全的替代函数,如fgetssscanf

  5. 跨平台兼容性scanf是C语言标准库的一部分,因此它在几乎所有的C语言编译器和平台上都能工作,这使得它具有很高的可移植性。

  6. 易于学习和使用scanf的语法相对简单,对于初学者来说,它是学习输入操作的一个很好的起点。

        然而,scanf也有一些局限性,比如它对输入格式的要求比较严格,如果用户输入不符合预期格式,可能会导致程序行为异常。因此,在实际应用中,开发者可能会选择更现代、更安全的输入函数,如fgets结合sscanf来读取输入,以提供更好的用户体验和程序稳定性。

十、C语言语句和语句分类

       在C语言中,语句是程序的基本执行单位,它告诉编译器执行特定的操作。C语言的语句可以分为以下几类:

1、声明语句:用于声明变量、函数或其他程序实体的语句。例如

int x;
float sum;

2、赋值语句:用于给变量赋值的语句。例如:

x = 5;
sum = 10.0;

3、表达式语句:包含表达式的语句,通常是赋值语句或函数调用。例如

x = x + 1;
printf("Hello, World!\n");

4、控制流语句:用于控制程序执行流程的语句,包括条件语句和循环语句。

        4.1条件语句:根据条件执行不同的代码块,如ifswitch

if (x > 0) {
    printf("x is positive\n");
} else {
    printf("x is not positive\n");
}

        4.2循环语句:重复执行代码块,如forwhiledo-while

for (int i = 0; i < 10; i++) {
    printf("%d\n", i);
}

5、跳转语句:用于改变程序控制流的语句,如breakcontinuegoto

while (1) {
    if (some_condition) {
        break; // 跳出循环
    }
}

6、复合语句:由多个语句组成的语句,通常用花括号{}括起来,形成一个代码块。例如

if (x > 0) {
    x = x * 2;
    printf("x is now %d\n", x);
}

7、空语句:只有一个分号的语句,不执行任何操作。例如

;

8、函数声明和定义:声明或定义函数的语句。例如

int add(int a, int b) {
    return a + b;
}

9、预处理指令:以#号开头的语句,用于在编译前处理源代码。例如

#include <stdio.h>
#define PI 3.14159

        这些语句构成了C语言程序的基础,通过它们的组合,可以创建出复杂和功能强大的程序。

十一、注释

        在C语言中,注释是用于解释代码的一种方式,它们对于提高代码的可读性非常重要。编译器在编译程序时会忽略注释,因此它们不会影响程序的执行。C语言支持两种类型的注释:

        单行注释:以//开头,直到行末的所有内容都被视为注释。例如:

// 这是一个单行注释
int x = 5; // 这里也可以添加注释

        多行注释:以/*开始,以*/结束,可以跨越多行。例如:

        

/*
这是一个多行注释
它可以跨越多行
*/
int y = 10;

        注释的目的是为了帮助其他开发者(或者未来的你)理解代码的作用和原因。良好的注释习惯可以节省大量调试和重构代码的时间。然而,过多的注释或者过时的注释可能会分散注意力,因此应该保持注释的相关性和简洁性。

  • 30
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值