hello world如何运行
#include <stdio.h>
int main()
{
printf("Hello, World!\n");
return 0;
}
main函数
这里的main就是 主函数,它是整个C语言程序的 入口。
就像去一个图书馆,大门是唯一的入口;无论图书馆里面有多少房间、多少层楼,你都得从大门进去。
C程序也一样,无论代码有多少行,都从main函数开始执行,执行完main后程序结束。
- 一个C程序中 有且只能有一个
main函数。 - 即使项目中有多个
.c文件,也只能有一个main,因为程序只能有一个入口
返回值 return 0; 的意义
在 main 函数中,我们通常写 return 0;。
这其实是告诉操作系统:程序正常结束了。
返回 0 表示程序成功执行。
如果返回非0值(比如 return 1;),表示程序运行过程中出现了某种异常。
操作系统可以捕获这个返回值,用来判断程序是否运行成功。 比如在批处理脚本中,可以根据返回值决定下一步操作。
Warning
错误的写法:void main() 在一些老旧的教材或示例中,你可能会看到这样的写法:
void main() { printf("Hello, World!\n"); }这种写法不符合C语言标准
printf和库函数
什么是库函数?
想象一下,你刚学会做菜。如果每次做番茄炒蛋,都要自己种番茄、养鸡、生蛋……那得等到猴年马月?
聪明的厨师会直接去菜市场买现成的食材。库函数,就是 C 语言为你准备好的“菜市场”!
库函数是 C 标准库里预先写好的函数,它们由编译器厂商根据 C 标准实现,供我们直接调用。
比如我们要在屏幕上打印文字,不需要自己写复杂的底层代码,直接用 printf 就行。
这样做的好处是:
- 省时:不用重复造轮子,开发效率大大提高。
- 可靠:库函数经过大量测试,稳定可靠。
- 跨平台:同一个函数在不同编译器、不同操作系统上表现一致。
除了 printf,C 标准库还提供了很多其他函数,比如:
输入函数:scanf
- 字符串处理:
strlen、strcpy - 数学计算:
sqrt、pow - 内存操作:
malloc、free
这些函数都根据功能分类放在不同的 头文件 中。
头文件 #include <stdio.h> 的作用
你可能会问:为什么每次用 printf 都要写 #include <stdio.h>?
因为 printf 这个函数是在 stdio.h 头文件中声明的。
头文件就像是函数的“说明书”,告诉编译器这个函数的名字、参数类型、返回值类型等信息。
如果你不包含这个头文件,编译器就不知道 printf 是什么,就会报错。
stdio.h 是 标准输入输出头文件,里面除了 printf,还有 scanf、putchar、getchar 等输入输出相关的函数。
所以,只要涉及屏幕输入输出,通常都需要 #include <stdio.h>。
Tip
C 标准库函数非常多,不可能全部记住。最好的方法是学会查文档。
cplusplus.com/reference/clibrary —— 界面友好,示例清晰。
cppreference.com —— 更权威、详细,适合进阶学习。
printf的使用
printf("Hello, World!\n");
上面的代码是使用printf 函数打印字符串。只要把想要打印的一串字符放在双引号中并传递给printf函数就可以打印。
除了打印字符串,printf 函数还可以打印其他类型的数据
printf("%d\n", 666) ;//printf打印整型
printf("%c\n", 'A');//printf打印字符
printf("%Lf\n",3.14);//printf打印双精度浮点型
格式说明符
格式说明符告诉 printf 如何解释后面的参数。最常用的有以下几种:
| 说明符 | 类型 | 示例 | 输出 |
|---|---|---|---|
| %d | int | printf("%d", 123); | 123 |
| %c | char | printf("%c", ‘A’); | A |
| %s | 字符串 | printf("%s", “hello”); | hello |
| %f | float / double | printf("%f", 3.14); | 3.140000 |
| %lf | double(在 printf 中与 %f 通用) | printf("%lf", 3.14); | 3.140000 |
| %e / %E | 科学计数法 | printf("%e", 123.4); | 1.234000e+02 |
| %x / %X | 十六进制(小写/大写) | printf("%x", 255); | ff |
| %o | 八进制 | printf("%o", 8); | 10 |
| %p | 指针地址 | printf("%p", ptr); | 0x7fff1234 |
| %% | 输出 % 本身 | printf("%%"); | % |
printf函数还有其他更多用法,可前往 文档 查看
C语言中的关键字
什么是关键字?
在 C 语言中,有一批特殊的单词,它们被语言本身“征用”了,有着固定的含义,不能用作变量名、函数名或其他标识符。这些单词就叫关键字(也叫保留字)。 你可以把关键字想象成停车场里的“专用车位”——上面写着“总经理专用”“残疾人专用”,普通车辆不能停进去。 C 语言的关键字就是给编译器预留的“专用车位”,如果你用它来命名自己的变量,编译器就会报错。
C 语言的32个关键字
C 语言标准(C89/C90)定义了 32 个关键字,如下面所示
| 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 |
Tip
这些关键字都是小写的,C 语言严格区分大小写,所以
If或WHILE并不是关键字,但为了代码规范,建议不要使用它们作为标识符。随着C语言标准更新,又加入了更多关键字,可在前往 文档 查看
字符和ASCII编码
什么是字符?
在键盘上敲出来的字母、数字、符号,比如 a、Z、1、@、#,这些统统叫做字符。 在 C 语言中,字符是用单引号括起来的,例如 ‘a’、‘1’、’$’。
字符和字符串有什么区别?
- 字符:单引号,一个字符,如 ‘A’。
- 字符串:双引号,一串字符,如 “Hello”。
ASCII 编码
计算机只认识 0 和 1,也就是二进制。那字符 ‘A’、‘b’、‘3’ 在计算机里怎么表示呢? 我们需要一个映射表,把每个字符对应成一个整数(二进制),这样计算机就能存储和处理了。这个映射过程就叫编码。
如果每个厂家都用自己的一套编码,那么 A 电脑写的文件拿到 B 电脑上可能就变成了乱码。 所以需要统一的标准。ASCII 就是这样的标准。
ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是计算机领域最基础的字符编码标准。 它用7位二进制(最高位为0)表示128个字符,包括:
- 大小写英文字母
- 数字 0~9
- 标点符号
- 控制字符(如换行、回车、响铃等)
每个字符对应一个唯一的整数(0~127),这个整数就是它的ASCII码值
常用 ASCII 码值
| 字符范围 | ASCII码值 |
|---|---|
| 数字 0~9 | 48 ~ 57 |
| 大写字母 A~Z | 65 ~ 90 |
| 小写字母 a~z | 97 ~ 122 |
| 换⾏ \n | 10 |
| 空格 | 32 |
大小写字母相差 32:'A' 是 65,'a' 是 97,差 32。
我们可以使用printf验证一下
printf("%c\n", 'A'); //输出A
//因为字符本质上就是整数,我们可以直接用整数打印:
printf("%c\n", '65'); //还是输出A
//反过来,也可以把字符当作整数使用:
printf("%d\n", 'A'); // 输出 65
ASCII 码值 32~126 是可以在屏幕上显示的可打印字符(包括空格、数字、字母、符号)。 我们可以写个循环把它们全部打印出来:
#include <stdio.h>
int main() {
int i;
for (i = 32; i <= 126; i++) {
printf("%c ", i);
if (i % 16 == 15) // 每16个换一行
printf("\n");
}
return 0;
}
运行结果
! " # $ % & ' ( ) * + , - . /
0 1 2 3 4 5 6 7 8 9 : ; < = > ?
@ A B C D E F G H I J K L M N O
P Q R S T U V W X Y Z [ \ ] ^ _
` a b c d e f g h i j k l m n o
p q r s t u v w x y z { | } ~
ASCII 值 0~31 是控制字符,比如:
\n(换行)对应 10\t(制表符)对应 9\a(响铃)对应 7\0(空字符)对应 0
这些字符不能直接显示在屏幕上,但有特殊作用。比如 \n 让光标移到下一行,\a 让电脑发出“嘀”的一声。
字符串和 \0
什么是字符串?
在 C 语言中,字符串是指用双引号括起来的一串字符,比如 "Hello"、"C language"、"123" 等。
字符串可以包含字母、数字、符号,甚至可以包含转义字符(如 \n)。
注意:字符是用单引号括起来的,如 'A';字符串是用双引号括起来的,如 "A"。
字符串在内存中是如何存储的?
C 语言使用字符数组存储字符串。例如 "Hello" 在内存中是这样存放的:
| 地址 | 内容 |
|---|---|
| 100 | ‘H’ |
| 101 | ’e’ |
| 102 | ’l’ |
| 103 | ’l’ |
| 104 | ‘o’ |
| 105 | \0 |
末尾会自动添加一个 \0(空字符),作为字符串结束标志。
每个字符占用一个字节,末尾会自动添加一个 \0 字符。
\0 是 ASCII 码为 0 的字符,叫做空字符(null character),它不是数字 0,而是一个特殊的控制字符。
它的作用只有一个:标志字符串的结束。
为什么要有 \0?
因为计算机只知道内存地址,不知道字符串有多长。
如果没有结束标志,程序就不知道在哪里停止。
\0 就像一个句号,告诉程序:“到这里,这个字符串就结束了。”
转义字符
什么是转义字符?
在 C 语言中,有些字符无法直接放在字符串或字符里,比如换行符、制表符、双引号、反斜杠本身等。为了表示这些特殊字符,C 语言引入了一种特殊的写法:转义字符。 转义字符以反斜杠 \ 开头,后面跟一个或多个字符,用来表示一个特殊的含义。 “转义”的意思就是:让这个字符原本的含义发生改变。 举个例子: n 本来只是一个普通的字母 n,但写成 \n 后,它就变成了“换行”的意思。
| 转义字符 | 含义 | ASCII码值 |
|---|---|---|
| \n | 换行(Newline) | 10 |
| \r | 回车(Carriage Return),光标移到行首 | 13 |
| \t | 水平制表符(Tab) | 9 |
| \v | 垂直制表符 | 11 |
| \b | 退格(Backspace),光标左移一格 | 8 |
| \f | 换页(Form Feed) | 12 |
| \a | 响铃(Alert),发出“嘀”声 | 7 |
| \ | 反斜杠本身 | 92 |
| ' | 单引号 | 39 |
| " | 双引号 | 34 |
| \0 | 空字符(字符串结束标志) | 0 |
| \ddd | 1~3位八进制数表示的字符 对应ASCII | |
| \xdd | 2位十六进制数表示的字符 对应ASCII |
语句
语句就是 C 程序中的基本执行单元,每条语句都以分号 ; 结束。
空语句
;//空语句是最简单的语句,它只有一个分号 `;`,什么也不做。
表达式语句
表达式语句就是在表达式后面加上分号。 几乎所有的运算都可以写成表达式,比如赋值、算术运算、关系比较等。
a = 5; // 赋值表达式语句
b = a + 10; // 算术表达式语句
x > y; // 关系表达式语句(虽然结果没使用,但合法)
函数调用语句
当调用函数时,在函数调用表达式后加分号,就构成了函数调用语句。函数调用语句可以单独成行,也可以出现在其他表达式里。
printf("Hello, World!\n"); // 调用 printf
scanf("%d", &a); // 调用 scanf
add(3, 5); // 调用自定义函数
复合语句(代码块)
复合语句是用一对花括号 {}将多条语句括起来,形成一个整体。
它又被称为代码块。复合语句可以出现在任何需要单条语句的地方,比如在 if 或 while 后面。
{
int a = 10;
printf("%d\n", a);
a = a + 5;
}
控制语句
控制语句用于改变程序的执行流程。C 语言提供了三类控制语句:
- 条件判断语句
- 循环执行语句
- 转向语句
C语言的注释
注释是什么?
你有没有在书里看到过这样的段落:
注:原文写于1931年。
这种“注”就是对原文的补充说明。在 C 语言中,注释也是类似的——它是写在代码里的说明文字,用来解释代码的作用、思路、注意事项等。 注释是写给人类看的,编译器会完全忽略它。 也就是说,注释不会影响程序的运行,只影响阅读代码的人。
在 C 语言中,注释有两种写法:
- 块注释:
/* ... */
/* 这是一个块注释
可以写多行
不会影响代码运行 */
int main() {
return 0;
}
块注释无法嵌套
/* 外层注释开始
/* 内层注释开始 */
这里的代码会被当作普通代码(因为内层注释已经结束了)
*/ // 这里才是外层注释的结束
- 单行注释:
//这种注释从//开始,直到行尾结束。
// 这是一个单行注释
int main() {
return 0; // 这也是注释,放在语句后面
}
编译时,注释会被替换成⼀个空格,比如he/*注释*/llo会变成he llo
为什么需要写注释
- 帮助自己理解 代码的逻辑往往很复杂,当时写的思路,过段时间可能就忘了。注释能帮你快速回忆。
- 方便他人阅读 在团队开发中,代码是给别人看的。清晰的注释能让同事快速理解你的意图,减少沟通成本。
- 利于维护和修改 当需要修改代码时,注释告诉你这段代码原本是干什么的,避免改出 bug。
hello world的运行
经过上面的学习,我们已经认识了hello world是如何运行的
#include <stdio.h> //包含头文件
int main() //主函数
{
printf("Hello, World!\n"); //输出字符串"Hello, World!",并在后面使用\n换行
return 0; //返回 0 程序正常结束
}
![【C语言】02 - 从[hello world]开始,走进C语言核心概念与基础语法](/images/bg/bg1.webp)