前言
大家好,欢迎来到《C语言初阶》第一篇,本篇我们将会为大家简单介绍什么是C语言、第一个C语言程序、数据类型、常量变量、字符串、转义字符、注释,让大家从零基础整体了解C语言。
1、什么是C语言
C语言是一门通用计算机编程语言,广泛应用于底层开发。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。
二十世纪八十年代,为了避免各开发厂商用的C语言语法产生差异,由美国国家标准局为C语言制定了一套完整的美国国家标准语法,称为ANSI C,作为C语言最初的标准。
C语言是一门面向过程的计算机编程语言,与C++,Java等面向对象的编程语言有所不同。其编译器主要有Clang、GCC、WIN-TC、SUBLIME、MSVC、Turbo C等。
简单来说:C语言是我们人类与计算机进行交流的语言,他可以把我们写出来的代码转化为计算机能识别的二进制指令,操作系统使用这些二进制指令让计算机来帮我们人类做各种各样的事情。
2、第一个C语言程序
#include<stdio.h> int main() { printf("hello world\n"); return 0; }
分析:
main:main 函数,程序的入口,一个程序有且只能有一个main函数。
printf:库函数,用来打印数据输出到屏幕上。
include<stdio.h>:include是包含的意思,stdio.h是printf库函数的头文件,使用printf必须在程序开头包含其对应的头文件。
return:main函数的返回值,这里如果程序正常结束就在返回1。
3、数据类型
char //字符数据类型
short //短整型
int //整形
long //长整型
long long //更长的整形
float //单精度浮点数
double //双精度浮点数
注:C语言当中没有字符串类型
每种数据类型的大小:
#include <stdio.h> int main() { printf("%d\n", sizeof(char)); //1 printf("%d\n", sizeof(short)); //2 printf("%d\n", sizeof(int)); //4 printf("%d\n", sizeof(long)); //4 printf("%d\n", sizeof(long long)); //8 printf("%d\n", sizeof(float)); //4 printf("%d\n", sizeof(double)); //8 printf("%d\n", sizeof(long double)); //8 return 0; } }
为什么要有这么多的数据类型:为了更加丰富的表达生活中的各种值。
数据类型的使用:
char ch = 'w'; int weight = 120; int salary = 20000;
有基础的同学可以阅读我另外一篇文章,里面对数据类型有全面的介绍:C语言关键字详解(一) auto、register关键字
4、常量与变量
生活中的有些值是不变的(比如:圆周率,性别,身份证号码,血型等等)。
有些值是可变的(比如:年龄,体重,薪资)。
不变的值,C语言中用常量的概念来表示,变的值C语言中用变量来表示。
常量
C语言中的常量分为以下以下几种:
- 字面常量
- const 修饰的常变量
- #define 定义的标识符常量
- 枚举常量
#include <stdio.h> //举例 enum Sex { MALE, FEMALE, SECRET }; //括号中的MALE,FEMALE,SECRET是枚举常量 int main() { //字面常量演示 3.14;//字面常量 1000;//字面常量 //const 修饰的常变量 const float pai = 3.14f; //这里的pai是const修饰的常变量 pai = 5.14;//是不能直接修改的! //#define的标识符常量 演示 #define MAX 100 printf("max = %d\n", MAX); //枚举常量演示 printf("%d\n", MALE); printf("%d\n", FEMALE); printf("%d\n", SECRET); return 0; }
注意:
- 枚举常量的默认是从0开始,依次向下递增1的。
- 上面例子上的 pai 被称为 const 修饰的常变量, const 修饰的常变量在C语言中只是在语法层面限制了变量 pai 不能直接被改变,但是 pai 本质上还是一个变量的,所以叫常变量。
关于const 的详细用法,有基础的同学可以阅读我的另外一篇文章:C语言关键字详解(四)带你全面了解 const 关键字
变量
定义变量的方法
int age = 150; float weight = 45.5f; char ch = 'w';
变量的分类
变量分为全局变量和局部变量
#include<stdio.h> int g_val = 10; //全局变量 int main() { int a = 20; //局部变量 printf("%d\n", g_val); printf("%d\n", a); return 0; }
注:当两个局部变量变量名相同时,编译器报错;当全局变量和局部变量变量名相同时,局部变量优先。
变量的使用
#include <stdio.h> int main() { int num1 = 0; int num2 = 0; int sum = 0; printf("输入两个操作数:>"); scanf("%d %d", &num1, &num2); sum = num1 + num2; printf("sum = %d\n", sum); return 0; }
分析:
scanf:库函数,格式化输入,用来接受从键盘上输进来的数据。。
nums1、nums2、sum:局部变量,用来存储数据。
变量的作用域和生命周期
作用域
作用域(scope)是程序设计概念,通常来说,一段程序代码中所用到的名字并不总是有效/可用
的。而限定这个名字的可用性的代码范围就是这个名字的作用域。
局部变量的作用域是变量所在的局部范围。
全局变量的作用域是整个工程。
生命周期
变量的生命周期指的是变量的创建到变量的销毁之间的一个时间段。
局部变量的生命周期是:进入作用域生命周期开始,出作用域生命周期结束。
全局变量的生命周期是:整个程序的生命周期。有基础的同学可以阅读我另外一篇文章,里面对局部变量、全局变量以及变量的作用域与生命周期有全面的介绍:C语言关键字详解(一) auto、register关键字
5、字符串+转义字符+注释
字符串
"hello world"
这种由双引号(Double Quote)引起来的一串字符称为字符串字面值(String Literal),或者简称字符
串。
字符串必须要注意的点:
- 字符串的结束标志是一个 \0 的转义字符。
- 在打印字符串和计算字符串长度的时候 \0 是结束标志。
- \0不算作字符串内容。
- 编译器会在字符串的末尾自动补上\0。
- 正确理解\0是字符串结束的标志:
如何理解\0是字符串的结束标志:
题目一:下面代码,打印结果是什么?
#include <stdio.h> int main() { char arr1[] = "hello"; char arr2[] = { 'h','e','l','l','o' }; char arr3[] = { 'h','e','l','l','o', '\0' }; printf("%s\n", arr1); printf("%s\n", arr2); printf("%s\n", arr3); return 0; }
分析:
arr1 是一个字符串,它在内存中存储的是:‘h’ ‘e’ ‘l’ ‘l’ ‘0’ ‘\0’六个字符,和 arr3 一样,而’\0’是字符串结束的标志,所以以 %s 打印arr1 和arr3 的时候是hello,而arr2 的末尾没有’\0’,所以当它以 %s 去打印的时候编译器不会在字符’o’的位置停下,而是会继续往后打印,直到遇到’\0’才停止,但是我们并不知道arr2后面的内存空间存放的是什么数据,所以arr2打印出来的字符个数以及是何种字符我们是无法确定的。
题目二:下面代码,打印结果是什么?
#include <stdio.h> #include<string.h> //strlen:求字符串长度的库函数,返回'\0'以前的字符的个数,其头文件是 string.h int main() { char arr1[] = "hello"; char arr2[] = { 'h','e','l','l','o' }; char arr3[] = { 'h','e','l','l','o', '\0' }; printf("%d\n", strlen(arr1)); printf("%d\n", strlen(arr2)); printf("%d\n", strlen(arr3)); return 0; }
分析:
补充:strlen:求字符串长度的库函数,返回’\0’以前的字符的个数,其头文件是 string.h
这里和上面一样,strlen 求字符串长度,遇到’\0’停止,所以arr1 和 arr3都是5,而arr2 末尾没有’\o’,而我们又不知道 arr2 后面的数据是什么,所以 arr2 打印出来的是随机值。
转义字符
C语言转义字符表:
常见转义字符的使用
#include<stdio.h> int main() { printf("hello\n"); // \n:换行,将光标移动到下一行 printf("hello\t"); // \t:水平制表符,一次跳过四个或者八个字符 printf("\n"); printf("\""); // \:将 " 的意思改变,让我们单独可以打印出 " printf("\n"); printf("\'"); // \:同上,将 ’ 的意思改变,让我们单独可以打印出 ‘ printf("\n"); printf("%c\n", '\130'); // \:将八进制的130转化为十进制的88,再打印88对应的ASCII表上的字符 'X' printf("%c\n", '\x61'); // \:将十六进制的60转化为十进制的97,再打印96对应的ASCII表上的字符 'a' return 0; }
ASCII 编码表:
对字符串和转义字符的理解:
笔试真题:下面代码的输出结果是什么?
#include <stdio.h> int main() { printf("%d\n", strlen("abcdef")); printf("%d\n", strlen("c:\test\628\test.c")); return 0; }
分析:
第一个我们不说,直接看第二个:c:\test\628\test.c,其中 \t \62 \t 被 \ 修饰转义,看作一个字符,所以一共是14个字符,可能有很多同学会把 \628 看作一个字符,从而得出答案13,但是请注意,八进制数的最大数是7,8不属于八进制的范畴,所以 \62 是一个字符,8 是另外一个字符。
题目二:下面程序的输出结果是什么
#include<stdio.h> int main() { char s[] = "012xy\08s34f4w2"; int i = 0; int n = 0; for (i = 0; s[i] != 0; i++) { if (s[i] >= '0' && s[i] <= '9') { n++; } } printf("%d\n", n); return 0; }
分析:012由于前面没有\,所以不会被转义,同时,循环结束的标志是 s[i] = 0,0是指数字0,而012中的0是字符0,所以循环继续,后面,0被\转义变成数字0,所以循环结束。
注释
注释有两种风格:
C语言风格的注释 : /xxxxxx/ ,注释方便,但不能嵌套注释。
C++风格的注释 : //xxxxxxxx ,可以注释一行也可以注释多行,也可以用 ctrl+k+c 与 ctrl+k+u 快速注释与取消注释,目前比较受欢迎。
注释的作用:可以对所写的程序进行解释说明,增强可读性。也可以对想删除或者没用、错误的代码直接注释。
#include <stdio.h> int Add(int x, int y) { return x+y; } /*C语言风格注释 //注释掉不想要的代码段 int Sub(int x, int y) { return x-y; } */ int main() { //C++注释风格 //int a = 10; //注释掉不想要的代码行 //调用Add函数,完成加法 //对代码进行说明解释 printf("%d\n", Add(1, 2)); return 0; }