学C51的基础5《 运算符 》

发布者:Heavenly999最新更新时间:2015-03-12 来源: laogu关键字:C51  运算符 手机看文章 扫描二维码
随时随地手机看文章
5. 运算符 

    Turbo C的运算符非常丰富, 主要分为三大类: 算术运算符,  关系运算符与逻辑运算符, 按位运算符。除此之外, 还有一些用
于完成特殊任务的运算符。下面分别进行介绍。 

    5.1 算术运算符 
    Turbo C的算术运算符如下: 
━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 
       操作符                          作用 
────────────────────────────
          +                        加, 一目取正 
          -                        减, 一目取负 
          *                             乘 
          /                             除 
          %                            取模 
          --                            减1 
          ++                            加1 
━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

    一、一目和二目操作 
    一目操作是指对一个操作数进行操作。例如: -a是对a进行一目负操作。 
    二目操作(或多目操作)是指两个操作数(或多个操作数)进行操作。 
    在Turbo C中加、减、乘、除、取模的运算与其它高级语言相同。需要注意的是除法和取模运算。 
    例如: 
      15/2    是15除以2商的整数部分7 
      15%2    是15除以2的余数部分1 
    对于取模运算符"%", 不能用于浮点数。 
    另外, 由于Turbo C中字符型数会自动地转换成整型数,  因此字符型数也可以参加二目运算。 
    例如: 
     main() 
     { 
          char m, n;     /*定义字符型变量*/ 
          m='c';         /*给m赋小写字母'c'*/ 
          n=m+'A'-'a';   /*将c中的小写字母变成大写字母'B'后赋给n*/ 
          ... 
     } 
    上例中m='c'即m=98, 由于字母A和a的ASCII码值分别为65和97。这样可以将小写字母变成大写字母, 反之, 如果要将大写字母
变成小写字母, 则用c+ 'a'-'A'进行计算。 

    二、增量运算 
    在Turbo C中有两个很有用的运算符, 在其它高级语言中通常没有。这两个运算符就是增1和减1运算符"++"和"--", 运算符"++"
是操作数加1, 而"--" 则是操作数减1。 
    例如: 
      x=x+1         可写成x++, 或++x 
      x=x-1         可写成x--, 或--x 
    x++(x--)与++x(--x)在上例中没有什么区别, 但x=m++和x=++m却有很大差别。 
      x=m++    表示将m的值赋给x后, m加1。 
      x=++m    表示m先加1后, 再将新值赋给x。 

    三、赋值语句中的数据类型转换 
    类型转换是指不同类型的变量混用时的类型改变。
    在赋值语句中, 类型转换规则是: 
      等号右边的值转换为等号左边变量所属的类型。 
    例如: 
     main() 
     { 
          int i, j;      /*定义整型变量*/ 
          float f, g=2.58;    /*定义浮点型变量*/ 
          f=i*j;         /*i与j的乘积是整型数, 被转换成为浮点数赋给f*/ 
          i=g;           /*g中的浮点型数转换成为整型数赋给i*/ 
          ... 
     } 
    由于Turbo C按上述数据类型转换规则, 因此在作除法运算时应特别注意。 
    例如: 
     main() 
     { 
          float f; 
          int i=15; 
          f=i/2; 
     } 
    上面程序经运行后, f=7并不等于准确值7.5。正确的程序应该是: 
     main() 
     { 
          float f; 
          int i=15; 
          f=i/2.0; 
     } 
    也可直接将i定义为浮点数。 

    5.2 关系运算符和逻辑运算符 
    一、逻辑运算符 
    逻辑运算符是指用形式逻辑原则来建立数值间关系的符号。 
    Turbo C的逻辑运算符如下: 
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 
        操作符                      作用 
───────────────────────────── 
          &&                       逻辑与 
                                 逻辑或 
          !                        逻辑非 
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 
    二、关系运算符 
    关系运算符是比较两个操作数大小的符号。 
    Turbo C的关系运算符如下: 
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 
        操作符                        作用 
───────────────────────────── 
          >                           大于 
          >=                        大于等于 
          <                           小于 
          <=                        小于等于 
          ==                          等于 
          !=                         不等于 
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 
    关系运算符和逻辑运算符的关键是真(true)和假(false)的概念。Turbo C中true可以是不为0的任何值, 而false则为0。使用
关系运算符和逻辑运算符表达式时, 若表达式为真(即true)则返回1,否则,表达式为假(即false), 则返回0。
    例如: 
     100>99         返回1 
     10>(2+10)      返回0 
     !1&&0          返加0 
    对上例中表达式!1&&0, 先求!1和先求1&&0将会等于出不同的结果,那么何者优先呢? 这在Turbo C中是有规定的。 有关运算符
的优先级本节后面将会讲到。 

    5.3 按位运算符 
    Turbo C和其它高级语言不同的是它完全支持按位运算符。这与汇编语言的位操作有些相似。 
    Turbo C中按位运算符有: 
━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 
        操作符                       作用 
──────────────────────────── 
          &                        位逻辑与 
                                  位逻辑或 
          ^                       位逻辑异或 
          -                        位逻辑反 
          >>                         右移 
          <<                         左移 
━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 
    按位运算是对字节或字中的实际位进行检测、设置或移位, 它只适用于字符型和整数型变量以及它们的变体, 对其它数据类型
不适用。 
    关系运算和逻辑运算表达式的结果只能是1或0。 而按位运算的结果可以取0或1以外的值。 
    要注意区别按位运算符和逻辑运算符的不同, 例如, 若x=7, 则x&&8 的值为真(两个非零值相与仍为非零), 而x&8的值为0。[page]
    移位运算符">>"和"<<"是指将变量中的每一位向右或向左移动, 其通常形式为: 
       右移:       变量名>>移位的位数 
       左移:       变量名<<移位的位数 
    经过移位后, 一端的位被"挤掉",   而另一端空出的位以0 填补, 所以, Turbo C中的移位不是循环移动的。
    5.4 Turbo C的特殊运算符 
    一、"?"运算符 
    "?"运算符是一个三目运算符, 其一般形式是: 
      <表达式1>?<表达式2>:<表达式3>; 
    "?"运算符的含义是: 先求表达式1的值, 如果为真, 则求表达式2 的值并把它作为整个表达式的值; 如果表达式1 的值为假,
则求表达式3 的值并把它作为整个表达式的值。 
    例如: 
     main() 
     { 
          int x, y; 
          x=50; 
          y=x>70?100:0; 
     } 
    本例中, y将被赋值0。如果x=80, y将被赋值100。 
    因此, "?"运算符可以代替某些if-then-else形式的语句。 

    二、"&"和"*"运算符 
    "&"运算符是一个返回操作数地址的单目操作符。 
    "*"运算符是对"&"运算符的一个补充, 它返回位于这个地址内的变量值, 也是单目操作符。 
    例如: 
     main() 
     { 
          int i, j, *m; 
          i=10; 
          m=&i;          /*将变量i的地址赋给m*/ 
          j=*m;          /*地址m所指的单元的值赋给j*/ 
     } 
    上面程序运行后, i=10, m为其对应的内存地址, j的值也为10。 

    三、","运算符 
    ","运算符用于将多个表达式串在一起, ","运算符的左边总不返回, 右边表达式的值才是整个表达式的值。
    例如: 
     main() 
     { 
          int x, y; 
          x=50; 
          y=(x=x-5, x/5); 
     } 
    上面程序执行后y值为9, 因为x的初始值为50, 减5后变为45, 45除5为9赋给y。 
  
    四、sizeof运算符 
    sizeof运算符是一个单目运算符, 它返回变量或类型的字节长度。 
    例如: 
     sizeof(double) 为8 
     sizeof(int)    为2 
    也可以求已定义的变量, 例如: 
     float f; 
     int i; 
     i=sizeof(f); 
    则i的值将为4。 

    五、联合操作 
    Turbo C中有一特殊的简写方式, 它用来简化一种赋值语句, 适用于所有的双目运算符。其一般形式为:
     <变量>=<变量><操作数><表达式> 
    相当于 
     <变量><操作数>=<表达式> 
    例如: 
      a=a+b         可写成    a+=b 
      a=a&b         可写成    a&=b 
      a=a/(b-c)     可写成    a/=b-c 
   5.5 Turbo C运算符的优先级 
    Turbo C规定了运算符的优先次序即优先级。 当一个表达式中有多个运算符参加运算时, 将按下表所规定的优先级进行运算。
表中优先级从上往下逐渐降低, 同一行优先级相同。 
    例如: 
       表达式 10>4&&!(100<99) 3<=5 的值为1 
       表达式 10>4&&!(100<99)&&3<=5 的值为0 
               Turbo C运算符的优先次序
━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━ 
                    表达式                              ┃优先级 
────────────────────────────╂──── 
  ()(小括号) [](数组下标) .(结构成员) ->(指针型结构成员)┃ 最高 
────────────────────────────┃  ↑ 
!(逻辑非) .(位取反) -(负号) ++(加1) --(减1) &(变量地址)┃  │ 
────────────────────────────┃  │ 
   *(指针所指内容)  type(函数说明)  sizeof(长度计算)    ┃  │ 
────────────────────────────┃  │ 
     *(乘)     /(除)     %(取模)                        ┃  │ 
────────────────────────────┃  │ 
     +(加)     -(减)                                    ┃  │ 
────────────────────────────┃  │ 
     <<(位左移)          >>(位右移)                     ┃  │ 
────────────────────────────┃  │ 
     <(小于)   <=(小于等于)   >(大于)   >=(大于等于)    ┃  │ 
────────────────────────────┃  │ 
     ==(等于)       !=(不等于)                          ┃  │ 
────────────────────────────┃  │ 
     &(位与)                                            ┃  │ 
────────────────────────────┃  │ 
     ^(位异或)                                          ┃  │ 
────────────────────────────┃  │ 
     (位或)                                            ┃  │ 
────────────────────────────┃  │ 
     &&(逻辑与)                                         ┃  │ 
────────────────────────────┃  │ 
     (逻辑或)                                         ┃  │ 
────────────────────────────┃  │ 
     ?:(?表达式)                                        ┃  │ 
────────────────────────────┃  │ 
     =    +=   -=(联合操作)                             ┃  │ 
────────────────────────────┃  │ 
     ,(逗号运算符)                                      ┃ 最低 
关键字:C51  运算符 引用地址:学C51的基础5《 运算符 》

上一篇:学C51的基础6 《 输入输出函数及控制流程语句 》
下一篇:学C51的基础4 《 变 量 》

推荐阅读最新更新时间:2024-03-16 13:54

51单片机C51精确延时
如下程序能实现ms级的比较精确的延时: void Delayms(unsigned int n) { unsigned int i,j; for(j=n;j 0;j--) for(i=112;i 0;i--); } 用keil可以看出这个延时的时间,我们先延时1ms(Delayms(1))。 进入Delayms前,sec=0.00042209s 延时后,sec=0.00142253s 可以知道Delayms(1)实际延时0.00142253s 0.00042209s=0.00100044s 1ms 同样如果想延时15ms的话,用Delayms(15),实际延时0.01480903s 15ms
[单片机]
51单片机<font color='red'>C51</font>精确延时
基于C51单片机的报警产生器电路原理图
  用 P1.0 输出 1KHz 和 500Hz 的音频信号驱动扬声器,作报警信号,要求 1KH z信号响 100ms , 500Hz 信号响 200ms, 交替进行, P1.7 接一开关进行控制,当开关合上响报警信号,当开关断开告警信号停止,编出程序。   ( 1 . 把 “ 单片机系统 ” 区域中的 P1.0 端口用导线连接到 “ 音频放大模块 ”区域中的 SPK IN 端口上;   ( 2 . 在 “ 音频放大模块 ” 区域中的 SPK OUT 端口上接上一个 8欧的或者是16 欧的喇叭;   ( 3 . 把 “ 单片机系统 ” 区域中的 P1.7/RD 端口用导线连接到 “四路拨动开关 ” 区域中的 K1 端口上.
[单片机]
基于<font color='red'>C51</font>单片机的报警产生器电路原理图
C51音乐程序
#i nclude reg52.h #i nclude intrins.h //本例采用89C52, 晶振为11.0592MHZ //关于如何编制音乐代码, 其实十分简单,各位可以看以下代码. //频率常数即音乐术语中的音调,而节拍常数即音乐术语中的多少拍; //所以拿出谱子, 试探编吧! unsigned char n=0; //n为节拍常数变量 unsigned char code music_tab ={ 0x18, 0x30, 0x1C , 0x10, //格式为: 频率常数, 节拍常数, 频率常数, 节拍常数, 0x20, 0x40, 0x1C , 0x10, 0x18, 0x10, 0x20 , 0x10, 0x1
[单片机]
[C51代码]广告灯的循环移动
#include reg51.h /************************************************/ sbit Key=P2^0; static unsigned char p=0; void delay1ms(unsigned int count) { int x,y; for(x=0;x count;x++) for(y=0;y 120;y++); } /************************************************/ void ScanKey() { if(Key==0) { delay1ms(1); if(Key==0) {
[单片机]
如何实现C51和汇编的混合编程
文中用到的编译器一律为keil 首先是一个范例,并从这个范例展开说明: ............ //C51 Code here #pragma ASM ............. //Here is the Assembler Code #pragma ENDASM ........... //C51 Code here 呵呵,其实C51和汇编的混合编程也就这么一回事。 但是我们还必须要做一些前提工作,首先在Project窗口中包含汇编代码(ASM)的C文件单击右键,选择“Options for ...”,然后点击“Generate Assembler SRC File”和“Assemble SRC File”
[单片机]
单片机C51串口printf的使用方法
串口printf的使用 函数原型如下: void USART0_Printf(char *fmt,...)//这个是我们的printf函数 { char* ap; //typedef char *va_list; va_list是char型的指针 charxdata string ; //访问外部RAM 两字节对齐 va_start(ap,fmt); //这个函数的功能是,找到第一个可变形参的地址,并把地址赋给ap vsprintf(string,fmt,ap); USART0_SendString(string); //这个函数就是发送字符串函数,通过上一个函数,就把该提取的东西都提取了 va_end(ap);
[单片机]
一个好玩的C51动态扫描小程序
初学者上手的简单程序,把下面代码复制进keil代码窗口,烧进51hei开发板,看看结果吧 #include reg52.h #define uchar unsigned char #define uint unsigned int #define dp P0 char code DuanMa ={0x01,0x02,0x04,0x08,0x10,0x20,0x40}; //单个数码管显示数 char code fenjie ={0,0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f}; char code WeiMa ={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //数码
[单片机]
单片机C51存储器类型及存储模式
  单片机(Microcontrollers)是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能集成到一块硅片上构成的一个小而完善的微型计算机系统。如今运用最为广泛的就是C51单片机,其中典型的有80C51和89c51单片机。今天主要以C51单片机存储器类型及存储模式为中心而展开的话题。   1、80C51存储器的结构   程序存储器寻址范围为64KB(用PC或DPTR),片内数据存储器寻址范围为256B,80H-FFH只能间接寻址,片外数据存储器寻址范围为64KB(DPTR、P2、@Ri)   图1 80C51程
[单片机]
单片机<font color='red'>C51</font>存储器类型及存储模式
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved