我对编程的看法(原创)

虽然自己还在大三不过对招聘的公司关注的还是比较多的,最近看到了“网易互动2007校园巡回招聘 ”其中有一篇报道是这样的:现在大部分的学习都太过快餐式,注重应用,对于概念、原理的把握很缺。知道了可以如何做,更需要知道为什么需要这么做,知本,这才是网易互动的要求。 原文地址 http://job.csdn.net/n/20060511/90262.html
  可以说我从大一到大二的时候,c++语言,VB语言也都是快餐试的学习,只强让自己记住了一些语法,然后应用,知道了如何做,可就是不知道为什么需要这么去做,我这里拿些例子出来吧。(各方面都有,都是我学习上遇到的)
1。我在破解的时候经常讲过要将机器码74改成75,或者74改成EB来实现静态的破解,这点我相信记住的人不少,不过又有多少人明白其中的原理呢????要是当你明白了这些或许你会恍然大悟,je/jz(汇编指令 相等/等于0)的短转移机器码在计算机里的表示为74xx,jnz/jne(不等于0/不相等)机器码为75xx,74改成75也就是je改成JNE符合我们的逻辑,当你在修改机器码的时候你可能会不知道为什么要这么修改,这时候你可以去查查“转移指令的条件和机器码”表。
2。这里假设一个函数color(int red,int blue,int green)他们汇编代码是这样的:
在C中:
push green
push blue
push red
call color;
在pascal(Delphi继承的语言):
push red;
push blue;
push green;
call color;
奇怪的是为什么这二个汇编调用参数的顺序会不同呢,或许你在读到的时候你会定性的认为参数的调用可以无序的,其实各种语言在堆栈里传递参数要遵守一种调用约定,调用约定规定C中参数传递顺序从右到左,PASCAL中为左到右,现在你该明白为什么了吧。
3。C++中的虚函数,我想没多少人明白什么时候该用虚函数,什么时候不用,为什么要引入虚函数的概念呢??其实如果派生类在重新定义一个成员函数的时候就应该在基类中把此函数设为virtual
  4。这学期我们软件学院开的主要是C#课程,我在学的过程中也有不少的体会,这里也拿过来说说,或许对正在学C#的同学也有点帮助.
  相信大家很早以前就听过.net的出现吧,.net到底是什么呢??为什么微软要推出.net的??它到底有什么奇特之处呢??许多人其实也都没去追寻这些问题,只是学校让我们学习这门课程我们就学吧,记住里面的语法在加以引用下就OK了,就算学会了。其实.NET的出现解决了程序员以前很多的问题,比如说多语言开发环境、大型复杂系统的发布配置问题。
  刚开始学习C#的时候我一直有着这个困惑,看看这段代码吧。
class helloname
{
  ......
}
static void Main(string[] args)
{
  helloname hello=new helloname();}
这句话到底是什么意思呢??书上写的是实例化,我在写代码的时候有时候会把()忘了,结果就会出现编译错误。我是这么想的既然有()它应该是个函数吧,他声明了个类的对象又调用了个函数进行实例化,理解得不来。呵呵,自己受C++的影响,在C++中类的对象是这么声明的:helloname hello;就声明完了。在图书馆查了查书,后面知道了,helloname()是构造函数,受C++声明对象影响没想到它是个构造函数,C#中必须对对象进行实例化也就是调用构造函数进行对象赋初值。
有个有趣的程序:
using system
class   ployline
{
public ployline()
  {
    this.x=122; this.y=222; this.z=322;
 
  }
protected int x;protected int y;protected int z;
public void getline(int x,int y,int z)
{
x=this.x; y=this.y; z=this.z;
}
class test1
{
  public static void Main()
  {
  ployline line=new ployline();
  int x; int y; int z;
  line.getline(x,y,z);
Console.writeline("x={0},y={1},z={2}",x,y,z);
}
}
}
程序在执行的过程无法通过编译:引用了未赋初值的x,y,z,于是我把上面改了下int x=0;
int y=0; int z=0;
程序可以通过编译,可不是我要的答案122,222,322,而是0,0,0为什么会是这个结果呢??
我们分析在调用line.getline方法时,参数值x,y,z的值会被复制到该方法的局部堆栈中,该方法对这些变量的任何修改都不会传递给调用程序的变量。
在C++解决这类问题的方法是:调用程序将指针或引用传递给变量。在C#中解决的方法类似就是使用关键字"ref"对上面程序修改下
using system
class   ployline
{
public ployline()
  {
    this.x=122; this.y=222; this.z=322;
 
  }
protected int x;protected int y;protected int z;
public void getline(ref int x,ref int y,ref int z)
{
x=this.x; y=this.y; z=this.z;
}
class test1
{
  public static void Main()
  {
  ployline line=new ployline();
  int x=0; int y=0; int z=0;
  line.getline(ref x,ref y,ref z);我认为这个参数关键字个DELPHI中参数var很象
Console.writeline("x={0},y={1},z={2}",x,y,z);
}
}
} 结果为x=122,y=222,z=322
  你现在是不是明白了ref关键字的使用了???
5。同样在C#中定义属性你是不是也很不明白呢??? 你是否想过下面这些问题呢?
c#中属性定义方法:
class line
{...
get
{
return x;
}                          
set
{
x=value;
}...
}
我们在Main()函数中可以这么使用
line add=new line(); add.x=122; int x1=line.x;
怎么编译器会通过呢?value我们没定义过,怎么能使用???现在你如果去查看MISL代码(.net产生的一种类似汇编的中间代码,可以使用SDK工具查看),就会明白它其实调用了get_x函数。
其实很多高级语言我们都需要理解为什么那么去做,这样我们才可以遍出更好的软件出来,光靠快餐式学习,缺少对概念、原理的把握是不行的。
好了,就写到这了,有空我在多写帖子,现在时间自己感觉也挺紧的,哈哈,希望有学习C#的同学和我沟通,现在对C#兴趣很农,上面是我自己的看法,可能有些错误,大家可以指出讨论,谢谢!!!



 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值