C语言的常见概念

156 阅读6分钟

main函数

每个C语言程序不管有多少行代码,都是从main函数开始执行的,main函数是程序的入口,它也别叫做主函数

一个main函数的标准格式为

int main()
{
    return 0;
}

其中,main前面的int表示函数返回的是一个整型的值,所以在main函数的最后写了return 0;正好前后呼应。

  • main函数是程序的入口
  • main函数有且只有一个
  • 即使在一个项目中,即存在多个.c文件的情况下,main函数依就只有一个,也就是说函数的入口只有一个

常见的错误总结

  • main函数的拼写方式
  • main函数后面漏掉了一对圆括号()
  • main()后面多加了分号;
  • 一条语句结束后,以分号;结尾

printf函数

printf函数是一个库函数,从C语言标准库函数中提出的现成的函数,使用时请包含头文件# include <stdio.h>

  • 功能:在屏幕上打印信息
# include <stdio.h>
int main()
{
    printf("hello word");
    return 0;
}

被双引号""引起来的是一个字符串,当然printf函数不仅可以打印字符串,还可以打印整数,小数,字符,下面是代码举例

# include <stdio.h>
// %s - 打印字符串
// %d - 打印整数
// %c - 打印字符
// %f - 打印小数
int main()
{
    printf("hello word\n");
    printf("%s\n", "hi word");
    printf("%d\n", 100);
    printf("%c\n", 'q'); //单引号括起来的表示字符
    printf("%f\n", 3.14);
    return 0;
}

其中\n表示换行符号,相当于在word文档中换行时按enter键。

关键字

auto double int struct break else long switch

case enum register typedef char extern return union

const float short unsigned continue for signed void

default goto sizeof volatile do if while static

ASCII码

不需要记住所有的ASCII码值,随用随查,一些记忆技巧

  • 字符A~Z的ASCII码值从65~90
  • 字符a~z的ASCII码值从97~122
  • 小写字符与大写字符的ASCII码之间差值为32
  • 数字字符0~9的ASCII码值从48~57
  • 换行符\n的ASCII码值为10
  • 而ASCII码值从0~31这32个字符是不可以打印出来的,无法在屏幕上观察

字符串\0

示例代码

int main()
{
    printf("%s", "abcdef");
    return 0;
}
  • 打印字符串时使用的为%s

  • 字符串"abcdef"的组成为a,b,c,d,e,f以及\0。这里\0为字符串的结束标志,为了更加深入的了解字符串中的\0,我们进行如下的代码进行调试

    int main()
    {
        char arr1[] = "abcdef";
        char arr2[] = { 'a','b','c','d','e','f' };
        printf("%s\n", arr1);
        printf("%s\n", arr2);
        return 0;
    }
    

    经过监视器窗口,我们发现arr1中是含有\0这一个字符的,而arr2中是没有\0这一个字符的。并且打印输出的结果如下:

    abcdef
    abcdef烫烫烫烫烫烫烫烫烫烫烫
    

从这里我们印证了\0为字符串结束的标志,而arr2在打印完字符串"abcdef"后又出现了一堆乱码,是因为"abcdef"后面没有字符串结束的标志—\0。那么,我们会产生两个疑问:

  1. 如何才能让arr2arr1的打印输出一致呢?
  2. 为什么arr2在出现一堆乱码后就停止打印了呢?如上面所说\0是字符串结束的标志,理想状态是没有结束的时候,程序会一直输出。

对于第一个问题:arr2之所以会在打印完字符串后继续打印一堆乱码,也是因为没有字符串结束标志,那么我们就为其补上字符串结束标志—\0,代码如下所示

int main()
{
    char arr1[] = "abcdef";
    char arr2[] = { 'a','b','c','d','e','f','\0'};
    printf("%s\n", arr1);
    printf("%s\n", arr2);
    return 0;
}
// 输出
abcdef
abcdef

对于第二个问题 : 当我们创建字符串arr1arr2时内存会分别开辟对应的空间,如下图所示

image-20250625171612570.png

即所开辟的内存空间,不仅仅存在"abcdef",还存在着其他的字符,当arr2在所开辟的内存空间中当第一次遇到\0时,就会结束。

库函数strlen()

  • 作用:求字符串的长度,即统计字符串中\0之前的字符个数

  • 因为strlen是一个库函数,因此在使用它的时候要调用它的库函数名头文件# include <string.h>

  • 代码示例:

    # include <string.h>
    int main()
    {
        char arr1[] = "abcdef";
        char arr2[] = { 'a','b','c','d','e','f'};
    ​
        printf("%zd\n", strlen(arr1));
        printf("%zd\n", strlen(arr2));
    ​
        return 0;
    }
    // 输出
    6
    28
    
  • 说明:strlen返回值时size_t类型的,应该在打印时使用%zd

转义字符

我们现在见到的\n\0均为转移字符。转义字符顾名思义就是改变字符原本的含义。下面是一些常见的转义字符的描述:

转义字符描述
'表示一个字符串内部的单引号
"表示一个字符串内部的双引号
\a警报,这会使得终端发出警报音或者出现闪烁,或者两者同时发生
\b退格键,光标回退一个字符,但不删除字符
\n换行符
\r回车符,光标移动回同一行的开头
\t制表符,光标移动到下一个水平制表位,通常是下一个4或8的倍数
\dddd d d表示1~3个八进制的数字,将``后面的数字转换为十进制
\xddd d表示2个十六进制数字,将``后面的数字转换为十进制
\0null字符,代表没有内容,其ASCII码值为0

image-20250626101617108.png

代码示例

int main()
{
	printf("%c\n", '\136');
	printf("%c\n", '\x30');
	return 0;
}
// 输出
^
0

test - 打印结果是什么?

# include <string.h>
int main() 
{
	printf("%zd\n", strlen("abcdef"));
	printf("%zd\n", strlen("c:\test\bib\110\test.c"));
	printf("%zd\n", strlen("c:\test\bib\119\test.c"));
	return 0;
}

语句和语句分类

C语言的代码是由一条一条的语句构成的。C语言中的语句可分为以下五类:

  • 空语句:一个分号就是一条语句,这条语句不需要任何事情

    # include <stdio.h>
    int main()
    {
    	;
    	return 0;
    }
    
  • 表达式语句

    # include <stdio.h>
    int main()
    {
    	int a = 10;
    	int b = 0;
    	b = a + 5; // 表达式语句
    	return 0;
    }
    
  • 函数调用语句:这里的函数可以是C语言的库函数,也可以是自己定义的函数

    # include <stdio.h>
    int Add(int x, int y)
    {
    	return x + y;
    }
    
    int main()
    {
    	printf("hello\n");
    	int ret = Add(2, 3);
    	return 0;
    }
    
  • 复合语句:就是一个被{}括起来的代码块

    # include <stdio.h<p align=center>></p>
    int main()
    {
    	int i = 0;
    	int arr[10] = { 0 };
    	
    	//for循环中被大括号括起来的循环体是复合语句
    	for (i = 0; i < 10; i++) 
    	{
    		arr[i] = 10 + i;
    		printf("%d\n", arr[i]);
    	}
    	return 0;
    }
    
  • 控制语句

    顺序,分支和循环语句,现在先笼统的记住,之后会详细说明。

注释

注释的两种形式

  • /**/:将所需注释的内容放到/**/之间

  • //:把注释内容放到//的后面,从双斜杠到行尾都属于注释

    //适用于单行注释,如果需要注释多行,开以选中要注释的行,点击下图所示的按钮,或者按快捷键ctrl+k,ctrl+c

    image-20250626112651044

不管哪种注释,都不能放在双引号里面

双引号里面的注释符号,会成为字符串的一部分,解释为普通符号,失去注释作用。

在编译时,注释会被替换成一个空格。

来源

本篇文章来自于b站鹏哥C语言教学视频的学习笔记