CodeGym /课程 /C# SELF /编译器和注释

编译器和注释

C# SELF
第 1 级, 课程 5
可用

1. C#编译器

计算机不懂人类的语言。其实它连编程语言都不懂。它只懂用机器码写的程序——全是0和1。

狗狗有“过来”、“握手”这些指令,听到就会做点啥。电脑的“指令”其实就是数字:每个命令都被编码成一个数字(也叫机器码)。

用数字写程序太难了,所以人类发明了编程语言和编译器。这种语言一方面人能看懂,另一方面编译器也能理解。编译器就是个特殊的程序,把你用编程语言写的代码翻译成一堆机器码。

一般程序员用编程语言写好程序,然后运行编译器,编译器会把你写的代码文件变成一个机器码文件——也就是最终(编译好的)程序。

  • 用C++写的程序
  • 编译器
  • 由机器码组成的程序
C++语言的编译阶段

最终生成的程序可以直接在电脑上运行。缺点是,这种程序的代码很依赖CPU和操作系统。比如在Windows下编译的程序,Android手机上就跑不了。

如果你写了个Android程序,那在Windows系统下它根本跑不起来!

不过C#有个更牛的方案。

  • 用C#写的程序
  • C#编译器
  • 由特殊IL代码组成的程序(字节码)
  • CLR
  • 由机器码组成的程序
C#语言的编译阶段

C#编译器不会把所有类都编译成一个机器码程序。它其实是把你的代码编译成一种特殊的中间IL代码(字节码),等到程序运行时才编译成机器码。

那到底是谁在程序运行时把它编译成机器码的?

这就要靠一个叫CLR(Common Language Runtime)的特殊程序——C#的虚拟机。先启动CLR,再启动你的字节码程序。CLR会在执行前把它编译成机器码。

如果你有很牛的CPU,支持更多机器指令,那“第二次编译”时生成的机器码就会针对你的CPU和操作系统优化。所以C#有时候比C++还快,C++直接编译成机器码,只能用最常见的指令。

2. 编译时常见错误

现在代码的速度和优化还不重要,重要的是编译器会帮你检查程序里的错误。它会检查代码对不对,哪怕有个小错也不会让你继续。

错误示例:

比如你想把数字赋值给只能存文本的变量。

string userName = 42; // 哎呀!这样不行。

编译器会直接报错,类型不匹配:"Cannot implicitly convert type 'int' to 'string'"。

另一个例子——命令WriteLine()拼错了:

Console.WriteLin("你好!"); // 方法名拼错了

编译器会说:“没有这个方法——检查下语法!”

怎么读错误信息?

大多数编译器会告诉你代码哪里错了,有时候还会给你修正建议。别怕报错:每个错误都是你升级打怪的机会。

3. 注释

想象下:你写了个很复杂的程序。一切都好,你就是天才!但一个月后你再打开那段代码……啥都看不懂。这里几行代码,那里奇怪的变量。脑子里只剩:“这肯定不是我写的!”这时候注释就救命了。

注释就像课本边上的小纸条,或者冰箱上的便签(“啤酒。别喝。留着明天!”)。编译器会无视它们,但人类不会。注释能解释代码的意思,标记重要细节,甚至“屏蔽”掉一段代码而不删掉。

注意:没有任何编译器会读你的注释,它们完全被忽略!

单行注释

C#有两种注释——单行和多行。单行注释用两个斜杠//开头,一直到行尾。//后面的内容全是注释,编译器完全无视。

例子:

Console.WriteLine("你好,世界!"); 	// 这行会在屏幕上显示问候语

这里// 这行会在屏幕上显示问候语就是注释。如果代码里有不明白的地方,就这样写注释!

再来个例子:

int x = 42; 	// 程序员的年龄

你也可以单独写一行注释:

// 初始化用户名变量
string userName = "瓦西娅";

就像剧本里的旁白:注释解释了为什么要这么写。

多行注释

如果你有很多要说的?写个故事?那就用多行注释,从/*开始,到*/结束。中间无论多少行,编译器都无视。

例子:

/*
  这里我们在屏幕上显示用户名。
  如果没有名字,就写“游客”。
*/
Console.WriteLine("请输入你的名字:");

或者这样:

int age = 18; /* 新用户的初始年龄 */

注意:多行注释不能嵌套。别想骗编译器——没用的。

举个例子:

类型 语法 例子
单行 // 注释 int x = 1; // 说明
多行 /* 随便写点啥 */ /* 这里可以解释你想说的任何东西 */

4. 生活中的例子

“屏蔽”一行代码:

有时候你想临时不让某段代码执行。注释就派上用场了:

// Console.WriteLine("暂时不需要的文本");

这行还在,但编译器“看不见”它。

TODO和FIXME标记

程序员也是人,有时候得提醒自己代码还没写完,或者这里有bug。常常会写:


// TODO: 检查下输入是不是空的
// FIXME: 这个函数算总和算错了

很多编辑器和IDE都会高亮这些词!

程序员的幽默

当然,有时候你会在代码里看到很有意思的注释:

// 我不为这段代码负责。是被逼着写的。
// 亲爱的,我_来自_未来!请原谅我写的这段代码。
// 如果我再看到类似的东西,我可能得带武器上班了。
// 如果这个条件哪天真的成立了,请打电话xxx-xxx-xxx,有赏。
// 亲爱的程序员:
//
// 当你“优化”完这个子程序
// 并意识到这是个大坑时
// 请把下面的计数器加一,给下一个人提个醒:
//
// 花在这里的小时数 = 42
// 当我开始写这个的时候,只有上帝和我知道我在干嘛。
// 现在只剩上帝知道了
// 有时候我觉得编译器根本不理我写的注释
// 我把所有代码、所有工作都献给我老婆达琳,
// 当这东西上线后,她得养活我、我们仨孩子和狗。

对,注释有时候真的很搞笑。毕竟写代码的是活生生的人嘛。

2
任务
C# SELF, 第 1 级, 课程 5
已锁定
带有单行注释的程序
带有单行注释的程序
2
任务
C# SELF, 第 1 级, 课程 5
已锁定
使用多行注释
使用多行注释
1
调查/小测验
命令和第一个程序第 1 级,课程 5
不可用
命令和第一个程序
命令和第一个程序
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION