运算符

对各种类型的数据进行加工的过程成为运算,表示各种不同运算的符号称为运算符,参与运算的数据称为操作数,按操作数的数目来分:运算符包括:一元运算符、二元运算符、三目运算符、分析运算符(特殊,其实它不是按数目,只是放一起分析)。按基本的运算符功能划分:
1 算术运算符: +,―,*,/,%,++,――。
2 关系运算符: >,<,>=,<=,==,!=。
3 布尔逻辑运算符: !,&&,|| 。
4 位运算符: >>,<<,>>>,&,|,^,~。
5 赋值运算符 =,及其扩展赋值运算符如+=,―=,*=,/=等。
6 条件运算符 ? :。
7 其它:
   
包括分量运算符· ,下标运算符 [],实例运算符instanceof,内存分配运算符new,强制类型转换运算符 (类型),方法调用运算符 () 等。例如:
  System.out.println(/"hello world/");
  int array1[]=new int[4];

一元运算符:若完成一个操作需要一个操作数,则称该运算符为单目运算符。

如:‘++’,‘--’,‘!’;i++,i--,!i

 

二元运算符:若完成一个操作需要两个操作数,则称该运算符为双目运算符;

如:‘+’,‘-’,‘*’;i+j,i-j,i*j

 

三元运算符:若完成一个操作需要三个操作数,则称该运算符为三目运算符;

后面将着重进行分析。

 

       分析运算符包括:段基址(SEG)、偏移量(OFFSET)、类型(TYPE)、长度(LENGTH)和字节总数(SIZE)运算符。前三个运算对象可以是变量和标号,但后两个的运算对象只能是变量。

     分析运算符用来把存储器操作数(变量或标号)分解为它的组成部分(段基址、偏移量、类型、元素个数和字节总数),并返回一个表示结果的数值。

     分析运算符格式如下:运算符 变量或标号使用分析运算符时,应当注意LENGTH运算符的取值,当变量是用重复数据操作符DUP说明的,则返回外层DUP给定的值;如果没有DUP说明,则返回值总是1.而SIZE运算符返回的值与LENGH和TYPE运算符有如下关系:SIZE 返回值=TYPE 返回值×LENGTH 返回值

分析运算符用来将存储器操作数分解为它的组成部分,这类运算符有SEG,OFFSET,TYPE,SIZE,LENGHT。合成运算符有PTR和THIS。
  1、SEG、OFFSET(分析运算符)

  SEG运算符返回的是存储器地址操作数的段分量,即取得存储器符号的段地址值;
  OFFSET运算符返回的是段内偏移量,即取得存储器符号的地址偏移量。 这两种分量一般都是数值。
  2、 TYPE、LENGTH、SIZE(分析运算符)
  TYPE取得存储器操作数的类型(字节=1,字=2,双字=4),返回一个数值,它表示存储器操作数相关的类型部分。各种存储器地址操作数类型部分的值分别为:数据字节为1;数据字为2;数据双字为4;NEAR和FAR的值无实际的物理意义。
  LENGTH取得存储器操作数元素的个数,即返回的数值是与存储器地址操作数相关的单元(字节、字或双字)数目。
  SIZE取得存储器操作数占用的存储器字节数,即返回的数值等于分配给指定的存储器地址操作数的字节数。
  注意:MASM 5.0验证(99.2.13)
     X DW 5 DUP (0) ;LENGTH X=5
     Y DW 0,0,0,0,0 ;LENGTH Y=1

  3、 PTR、THIS(合成运算符)
   PTR用于指定存储单元的类型,它能产生一个新的存储器地址操作数(一个变量或标号)。新的操作数的段地址和段内偏移量与源操作数相同,但类型不同。它与数据定义语句不同,PTR运算符不分配任何存储器,它只是给已分配了的存储单元一个新的意义。
  THIS产生一个新的变量或标号,其地址等于当前地址,类型在THIS中指定。(THIS不分配存储器)。

  4、$
  $符号表示当前地址。

关于三目运算符
对于有些选择分支结构,可以使用简单的条件运算符来代替.如:

引用
if(a<b)
    min=a;
else
    min=b;

可以用下面的条件运算符来处理

min=(a<b)?a:b;



其中"(a<b)?a:b"是一个"条件表达式",它是这样执行的:如果a<b为真,则表达式取a值,否则取b值.

条件运算符由两个符号组成"?"和":",要求有3个操作对象,所以也叫它三目运算符,它是C语言中唯一的三目运算符.它的一般形式为:

引用
表达式1?表达式2:表达式3;

以下是关于条件运算符的几点说明:

(1) 通常情况下,表达式1是关系表达式或逻辑表达式,用于描述条件表达式中的条件,表达式2和表达式3可以是常量,变量或表达式.例如:

引用
(x==y)?'Y':'N'
(d=b*b-4*a*c)>=0?sqrt(d):sqrt(-d)
ch=(ch>='A'&&ch<='Z')?(ch+32):ch

以上均为合法的条件表达式.

(2) 条件表达式的执行顺序为:先求解表达式1,若值为非0,表示条件为真,则求解表达式2,此时表达式2的值就作为整个条件表达式的值;若表达式1的值为0,表示条件为假,则求解表达式3,表达式3的值就是整个条件表达式的值.例如:

引用
(a>=0)?a:-a

执行结果是a的绝对值.

(3) 在程序中,通过把条件表达式的值直接赋予某个变量.例如:

引用
min=(a<b)?a:b

执行结果就是将条件表达式的值赋予变量min,即将a和b二者中较小的数赋给min.

(4) 条件表达式的优先级别仅高于赋值运算符,而低于前面遇到过的所有运算符.因此,min=(a<b)?a:b括号可以不要,可直接写成,min=a<b?a:b如果有x<y?x+1:y-1等效于x<y(x+1):(y-1)而不等效于(x<y?x+1:y)-1

(5) 条件运算符的结合方向为"自右至左".

(6) 条件表达式允许嵌套,即允许条件表达式中的表达式2和表达式3又是一个条件表达式.例如:

引用
x>0?1:x<0?-1:0

上述条件表达式中,表达式3部分又是一个条件表达式.根据条件表达式的结合性,上述条件表达式等价于:

引用
x>0?1:(x<0?-1:0)

其作用是判断x的符号情况.当x为正数时,该条件表达式的值为1;当x为负数时,该条件表达式的值为-1;当x为0时,该条件表达式的值为0.

(7) 条件表达式不能取代一般的if语句,仅当if语句中内嵌的语句为赋值语句(且两个分支都给同一变量赋值)时才能代替if语句.例如:

引用
if(a%2==0)
    printf("even/n");
else
    printf("odd/n");

不能写成:

引用
(a%2==0)?printf("even/n"):printf("odd/n");

但可以用下面语句代替:

引用
printf("%s/n",(a%2==0?"even":"odd");

该语句的作用是:若a为偶数,输出even;若a为奇数,输出odd.

(8) 表达式1,表达式2,表达式3的类型可以不同.此时条件表达式的值的类型为它们中较高的类型.例如:

引用
main()
{
     char c1,ch;
     ch=getchar();
     c1=ch<='Z'&&ch>='A'?' at ':ch;
     putchar(c1);
}

该程序的作用是从键盘输入任意一个字符,判别它们是否大写字母,如果是,输出一个@;否则按原样输出 dot

上例中,程序第6行是关键语句,该语句实现输入字符的判断,选择与更换工作.其执行过程为:先由此语句中的赋值号右侧的条件运算符对输入的字符进行判断和选择,若ch>='A'&&ch<='Z'成立,说明ch是大写英文字母,此时选'@';否则仍选原字符ch,然后把选择的结果赋值给原变量ch dot

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值