黑马程序员—由小示例引出程序编译与运行

最近遇到的一个问题:

  看如下代码:

   static void Main(string[] args)

        {

            while (true)

            {

                Console.WriteLine("请输入一个数字,我们来判断是不是整数!如果是则输出它本身,不是则输出0! ");

                string input = Console.ReadLine();

                int result = ZhengShu (input);

                Console.WriteLine(result);

            }

        }

 

        public static int ZhengShu(string input)

        {

            bool flag = true;

            int result = 0;

            while (flag)

            {

                try

                {

                    result = Convert.ToInt32(input);

                    flag = false;

                }

                catch

                {

                    flag = false;

                }

                //return result;

            }

            return result;

        }

这里判断输入的是否是整数的方法ZhengShu,是有一个int类型的返回值的,这种写法,我们只能在while循环外面返回一个数result,而不能在while循环里面返回,如果写在里面,编译生成是不成功的,会提示我们:错误 “ZhengShu.Program.ZhengShu(string)”: 并非所有的代码路径都返回值。

这是因为,只有当我们程序运行到 bool flag = true;的时候,程序才知道我们的flag = true。而如果我们的程序编译不成功,程序就无法运行。但是在编译的过程中,编译器并不知道你声明的bool类型变量flag到底是true还是false,如果是true,循环可以执行;如果是false循环是根本进不去的,如果进不去循环,在循环里返回值就没有意义了,所以,就会提示错误,有错误程序就没法编译成功,更没法运行。

而如果我们想在while循环里返回值,就应该直接把循环条件改为true,而不是用flag!

这就是运行与编译生成的区别。我们不能想当然的以为什么。

编译就是把高级语言变成计算机可以识别的二进制语言,计算机只认识1和0,编译程序把人们熟悉的语言换成二进制的。 编译程序把一个源程序翻译成目标程序的工作过程分为五个阶段:词法分析;语法分析;语义检查和中间代码生成;代码优化;目标代码生成。主要是进行词法分析和语法分析,又称为源程序分析,分析过程中发现有语法错误,给出提示信息。

需要注意的是,一般上编译器只做语法检查和最简单的语义检查,而不检查程序的逻辑。像上例,编译程序不知道flag是什么;它只看语法语义,不看内容逻辑,不知道这里flag到底是什么。

在.Net中计算机并不能直接执行咱们所写的c#代码,当咱们写好了代码,c#编译器会把它编译成MSIL中间语言,然后再经过CLR(公共语言运行时的处理),把它们编译成计算机所认识的语言,计算机CLR编译后的这些代码,进行操作。当程序运行的时候,CLR首先加载所有的类到内存中,然后找到其中的Main函数,从上到下一行代码一行代码的执行。程序是编译成功,生成可执行文件以后,才可以运行。以后我们遇到这种情况还需要注意。

posted @ 2013-05-07 18:27  帅大屋  阅读(140)  评论(0编辑  收藏  举报