飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 2280|回复: 0

3.3 运算符

[复制链接]

该用户从未签到

发表于 2005-2-26 20:55:48 | 显示全部楼层 |阅读模式
3.3 运算符Sample TextSample Text

  在你定义了的变量之后,通常都要对变量赋值、改变变量的值和使用变量进行计算,这都是运算符的作用。
3.3.1 优先级

  表3-4按从高到低的优先级列出了运算符。同一行中的运算符优先级相同。


            .    []        ()
           ++    --         !       ~
            *     /         %
            +     -
           <<    >>        >>>
           <     >         <=       >=
           ==    !=
           &
           ^
           &&
           ||
           ?:
           =
        
              表3-4 运算符的优先级

  优先级是指同一式子中多个运算符被执行和次序,同一级里的操作符具有相同的优先级,例如对于表达式:
    a=b+c*d/(c^d)
  Java处理时将会按照表3-4从最高优先级到最低的次序进行,在本例中,因为括号优先级最高,所以先计算c^d,接着是c*d,然后除以c^d,最后,把上述结果与b的和存储到变量a中,不论任何时候,当你一时无法确定某种计算的执行次序时,可以使用加括号的方法明确为编译器指定运算顺序,这也是提高程序可读性的一个重要方法。

3.3.2 整型运算符

  整型运算符按操作数的多少可分为一元和二元两类,一元运算符一次对一个变量进行操作,二元运算符一次对两个变量进行操作。对于运算来说,如果有一个变量或操作数是长整型的,那么结果就肯定是长整型的,否则即使操作数还没有确定是字节型、短整型或字符型,运算结果都是整型,表3-5是一元运算符的列表。


        运算符        实际操作          例子
   
         -       改变整型数符号         -i
         ~        位运算:非            ~i
         ++       加1                   i++
         --       减1                   i--

              表3-5  一元运算符列表

注:一元取反运算符(-)用来改变整数的正负号,逐位求反把所变量所有是1的位变成0,是0的位变成1,加加和减减(++,--)把变量的值加1或减1。
  以下是一个具体例子:


      int i=0;
      int j=1=;
      for (i=1;i<10;i++)
      
         j--;
         System.out.println(i+""+j+"");

  这个程序的一行执行加运算,另一行执行减运算,注意“++”和“--”的使用,每次遇到“++”或“--”的时候,系统就把操作数的值相应地加1或减1,一元运算符执行的方式是改变它们所作用的变量的值,对一元取反和逐位求反来说,变量的值并不改变,而对加和减运算(++,--)来说,就量的值被改变了,下面的代码给出了这种工作方式的一个例子:    int i=10,j=10,k=10,l=10;
    System.out.println(i+""+j+""+k+""+l+"");
    j++;
    i--;
    ~k;
    -l;
    System.out.println(i+""+j+""+k+""+l+"");
  注意j和i被改变并打印出它们的新值,可是k和l仍然为原来的数值,当在复合表达式中使用一元取反和逐位求余运算时,你实际上是在用一个临时存贮操作数的新值。
  ++和--既是前置运算符也是后置运算符,这就是说,它们既可以放在操作数前面(++x),也可以放在后面(x++),如果它们被用在复合语句中如:
    i=x++; 或 i=++x;
  那么第一个语句中x把值赋给i以后再加1,而第二个语句先把x加1,再把新的x值赋给i。
  整型运算符的第二种类型是二元运算符,这种运算并不改变操作数的值,而是返回一个必须赋给变量的值,表3-6列出了二元运算符。


        运算符          实际操作          例子
      
          +             加运算            a+b
          -             减运算            a-b
          *             乘运算            a*b
          /             除运算            a/b
          %           取模运算            a%b
          &             与运算            a&b
          |             或运算            a|b
          ^           异或运算            a^b
          <<            左移              a<<b
          >>            右移              a>>b
          >>>           右移              a>>>b

               表3-6 二元运算符列表

注意:>>与>>>的基本功能都是右移,但>>是用符号位来填充右移后所留下的空位,而>>>则是用零来填充右移后所留下的空位。
  还有一类运算,它们形如:j-=i,这里-=是二元运算-和赋值运算=的复合运算,它等价于j=j-i,这种复合方式适用于所有的二元运算符。
  这里有几点关于整型运算进一步说明,首先,整数除法向靠近0的方向取整;其次,如果你除以0或者对0取模,程序就会在运行时被强行中止,如果你的运算结果超出最小极限,或者说是下溢,结果将为0,如果超出了最大极限,就将会导致结果的回绕。

3.3.3 布尔运算符

  另外还有一些运算符能产生布尔类型的结果,我们把它们称为布尔运算符,表4-7列出了这些运算符。


          运算符      实际操作          例子
   
          <           小于              a<b
          >           大于              a>b
          <=          小于等于          a<=b
          >           大于等于          a>=b
          ==          等于              a==b
          !=          不等于            a!=b

               表3-7  产生布尔类型结果的运算符

  在这里要指出的是相等运算符==可能会给你带来许多麻烦,很多人在比较两个值时往往错用了等号=,以致于变成了赋值操作,所以在编程中一定要注意你在比较数值时用的是==。布尔类型本身还有几个逻辑运算符,它们可以对布尔类型的数据进行运算:
    !,&&,//
  其实如果你把布尔类型的值true等效地看成1,false看成0,那么对于相同的运算符,整型运算的法则对布尔类型也是适用的。
  布尔运算符中还有一种三元运算符,它的格式如下:
    Operand ? Statement1:Statement2
  在这个式子中,先计算Operand的真假,若为真,则执行Statement1,若为假,则执行Statement2。下面的代码给出了这种运算的一个例子:
    (a>b)?a:b;
  这个表达式将返回a和b中较大的那个数值。

3.3.4 浮点型运算符

  传统的浮点型二元运算除了赋值运算符(+=,-=.*=./)取模(%)和取模赋值(%=0)使浮点数值等价于整数除法,同样,++和--使变量的值增加或减小1。
  同整型变量相似,结果被放在最大长度的类型里,如果运算包括两个浮点类型,结果也是个浮点类型,如果有一个或几个是双精度浮点型,结果就是双精度浮点型,当你使用关系运算符:>、<、>=、<=、==和!=时,注意浮点变量与整型的不同,只有a==b成立并不能说明a<b和a>b不成立,这是因为浮点类型数值次序同整型不同,当你写程序,对浮点型数值进行假设时要小心,浮点型数值也包括inf,代表无穷大,溢出产生无穷大inf,下溢产生0。

3.3.5 字符串运算符

  +运算符可以把字符串并置起来,如果哪一个操作数不是字符串,在并置之前它会被转换成字符串,另外,+=运算符把两个字符串并置的结果放进第一个字符串里,在前面的例子里,当你想把几项打印在同一行里时使用的是+运算符,试着在解释器里用System.out.println和+运算符来造成不同的组合输出。
PYG19周年生日快乐!
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表