C 程式设计从零开始之赋值操作符

2008-02-23 05:24:37来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

 赋值语句

  前面已说明,要访问内存,就需要相应的地址以表明访问哪块内存,而变量是个映射,因此变量名就相当于一个地址。对于内存的操作,在一般情况下就只有读取内存中的数值和将数值写入内存(不考虑分配和释放内存),在C 中,为了将一数值写入某变量对应的地址所标识的内存中(出于简便,以后称变量a对应的地址为变量a的地址,而直接称变量a的地址所标识的内存为变量a),只需先书写变量名,后接“=”,再接欲写入的数字连同分号。如下:

a = 10.0f; b = 34;

  由于接的是数字,因此就能够接表达式并由编译器生成计算相应表达式所需的代码,也就可如下:

c = a / b * 120.4f;

  上句编译器将会生成进行除法和乘法计算的CPU指令,在计算完毕后(也就是求得表达式a / b * 120.4f的值了后),也会同时生成将计算结果放到变量c中去的CPU指令,这就是语句的基本作用(对于语句,在《C 从零开始(六)》中会周详说明)。

  上面在书写赋值语句时,应该确保此语句之前已将使用到的变量定义过,这样编译器才能在生成赋值用的CPU指令时查找到相应变量的地址,进而完成CPU指令的生成。如上面的a和b,就需要在书写上面语句前先书写类似下面的变量定义:

float a; long b;


  直接书写变量名也是一条语句,其导致编译器生成一条读取相应变量的内容的语句。即能够如下书写:

a;

  上面将生成一条读取内存的语句,即使从内存中读出来的数字没有任何应用(当然,假如编译器开了优化选项,则上面的语句将不会生成任何代码)。从这一点连同上面的c = a / b * 120.4f;语句中,都能够看出一点——变量是能够返回数字的。而变量返回的数字就是按照变量的类型来解释变量对应内存中的内容所得到的数字。这句话也许不是那么容易理解,在看过后面的类型转换一节后应该就能够理解了。
因此为了将数据写入一块内存,使用赋值语句(即等号);要读取一块内存,书写标识内存的变量名。所以就能够这样书写:a = a 3;
假设a原来的值为1,则上面的赋值语句将a的值取出来,加上3,得到结果4,将4再写入a中去。由于C 使用“=”来代表赋值语句,很容易使人和数学中的等号混淆起来,这点应注意。

  而如上的float a;语句,当还未对变量进行任何赋值操作时,a的值是什么?上帝才知道。当时的a的内容是什么(对于VC编译器,在开启了调试选项时,将会用0xCCCCCCCC填充这些未初始化内存),就用IEEE的real*4格式来解释他并得到相应的一个数字,也就是a的值。因此应在变量定义的时候就进行赋值(但是会有性能上的影响,但是很小),以初始化变量而防止出现莫名其妙的值,如:float a = 0.0f;。

  赋值操作符

  上面的a = a 3;的意思就是让a的值增加3。在C 中,对于这种情况给出了一种简写方案,即前面的语句能够写成:a = 3;。应当注意这两条语句从逻辑上讲都是使变量a的值增3,但是他们实际是有区别的,后者能够被编译成优化的代码,因为其意思是使某一块内存的值增加一定数量,而前者是将一个数字写入到某块内存中。所以假如可能,应尽量使用后者,即a = 3;。这种语句能够让编译器进行一定的优化(但由于现在的编译器都很智能,能够发现a = a 3;是对一块内存的增值操作而不是一块内存的赋值操作,因此上面两条语句实际上能够认为完全相同,仅仅只具备简写的功能了)。

  对于上面的情况,也能够应用在减法、乘法等二元非逻辑操作符(不是逻辑值操作符,即不能a &&= 3;)上,如:a *= 3; a -= 4; a |= 34; a >>= 3;等。

  除了上面的简写外,C 还提供了一种简写方式,即a ;,其逻辑上等同于a = 1;。同上,在电脑编程中,加一和减一是经常用到的,因此CPU专门提供了两条指令来进行加一和减一操作(转成汇编语言就是Inc和Dec),但速度比直接通过加法或减法指令来执行要快得多。为此C 中也就提供了“ ”和“—”操作符来对应Inc和Dec。所以a ;虽然逻辑上和a = a 1;等效,实际由于编译器可能做出的优化处理而不同,但还是如上,由于编译器的智能化,其是有可能看出a = a 1;能够编译成Inc指令进而即使没有使用a ;却也依然能够得到优化的代码,这样a ;将只剩下简写的意义而已。



[1] [2] [3] [4] 下一页

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇: 用C 实现简单的文档I/O操作

下一篇: 对C/C 中多维数组指针的理解

热门词条
热门标签