六、运算符

主要内容:

  • 理解运算符++ --的运算方式
  • 理解+符号在字符串中的作用
  • 理解比较运算符
  • 理解逻辑运算符
  • 掌握三元运算符的格式和计算结果

1 算数运算符

算术运算符说明
+加法运算,字符串连接运算
-减法运算
*乘法运算
/除法运算
%取模运算,两个数字相除取余数
++--自增自减运算

Java中,整数使用以上运算符,无论怎么计算,也不会得到小数。

public static void main(String[] args) {
	int i = 1234;
	System.out.println(i/1000*1000);//计算结果是1000
}

1.1 ++-- 运算

  1. ++变量自己增长1。
  2. --变量自己减少1,用法与 ++ 一致。
  3. 独立运算:变量在独立运算时,“前++( ++i )”“后++( i++ )” 没有区别 。
  4. 混合运算:和其他变量放在一起,“前++”“后++” 就产生了不同。
    1. 变量前++:变量a自己加1,将加1后的结果赋值给b,也就是说a先计算。a和b的结果都是2;
      public static void main(String[] args) {
      	int a = 1;
      	int b = ++a;
      	System.out.println(a);//计算结果是2
      	System.out.println(b);//计算结果是2
      }
      
    2. 变量后++:变量a先把自己的值1,赋值给变量b,此时变量b的值就是1,变量a自己再加1。a的结果是2,b的结果是1。
      public static void main(String[] args) {
      	int a = 1;
      	int b = a++;
      	System.out.println(a);//计算结果是2
      	System.out.println(b);//计算结果是1
      }
      

1.2 + 符号在字符串中的操作

+ 符号在遇到字符串的时候,表示连接、拼接的含义。
"a"+"b" 的结果是 “ab”

public static void main(String[] args){
	System.out.println("5 + 5 = " + 5 + 5);//输出5 + 5 = 55
}

2 赋值运算符

赋值运算符:将符号右边的值,赋给左边的变量。

赋值运算符说明
=等于号
+=加等于
-=减等于
*=乘等于
/=除等于
%=取模等
public static void main(String[] args){
	int i = 5;
	i += 5;//计算方式 i=i+5 变量i先加5,再赋值变量i
	System.out.println(i); //输出结果是10
}

3 比较运算符

比较运算符:两个数据之间进行比较的运算,运算结果都是布尔值 true 或者 false

比较运算符说明
==比较符号两边数据是否相等,相等结果是true。
<比较符号左边的数据是否小于右边的数据,如果小于结果是true。
>比较符号左边的数据是否大于右边的数据,如果大于结果是true。
<=比较符号左边的数据是否小于或者等于右边的数据,如果小于结果是true。
>=比较符号左边的数据是否大于或者等于右边的数据,如果小于结果是true。
!=不等于符号 ,如果符号两边的数据不相等,结果是true。
public static void main(String[] args) {
	System.out.println(1 == 1);//true
	System.out.println(1 < 2);//true
	System.out.println(3 > 4);//false
	System.out.println(3 <= 4);//true
	System.out.println(3 >= 4);//false
	System.out.println(3 != 4);//true
}

4 逻辑运算符

逻辑运算符:连接两个布尔值的运算符,运算结果都是布尔值 true 或者 false

逻辑运算符名称说明
&1. 两边都是true,结果是true
2. 一边是false,结果是false
无短路特点:符号左边是false,右边仍运算。
|1. 一边是true,结果是true
2. 两边都是false,结果是false
无短路特点:符号左边是true,右边仍运算。
&&短路与1. 两边都是true,结果是true
2. 一边是false,结果是false
短路特点:符号左边是false,右边不再运算。
||短路或1. 一边是true,结果是true
2. 两边都是false,结果是false
短路特点:符号左边是true,右边不再运算。
^异或1. 两边相同,结果是false
2. 两边不同,结果是true
!1. ! true 结果是false
2. ! false 结果是true
public static void main(String[] args) {
	System.out.println(true && true);//true
	System.out.println(true && false);//false
	System.out.println(false && true);//false,右边不计算
	
	System.out.println(false || false);//false
	System.out.println(false || true);//true
	System.out.println(true || false);//true,右边不计算

	System.out.println(true ^ true);//false
	System.out.println(false ^ true);//true
	
	System.out.println(!false);//true
}

&&&||| 在运算结果上一样,只是 &&|| 具有短路特点。

5 位运算符

位运算符:对单个或多个数据进行按位运算。

按位运算符名称形式说明
&按位与A & B 将A和B的二进制形式的每一位上的数字依次进行 & 运算。

运算规则:逢0得0。
1 & 1 = 11 & 0 = 00 & 1 = 00 & 0 = 0

3 & 4:
  3的二进制:00000000 00000000 00000000 00000011
  4的二进制:00000000 00000000 00000000 00000100
  3 & 4:        00000000 00000000 00000000 00000000,结果是:0
|按位或A | B将A和B的二进制形式的每一位上的数字依次进行 | 运算。

运算规则:逢1得1。
1 | 1 = 11 | 0 = 10 | 1 = 10 | 0 = 0

3 | 4:
  3的二进制:00000000 00000000 00000000 00000011
  4的二进制:00000000 00000000 00000000 00000100
  3 | 4:         00000000 00000000 00000000 00000111,结果是:7
^按位异或A ^ B将A和B的二进制形式的每一位上的数字依次进行 ^ 运算。

运算规则:相同为0,不同为1(同0异1)。
1 ^ 1 = 01 ^ 0 = 10 ^ 1 = 10 ^ 0 = 0

3 ^ 4:
  3的二进制:00000000 00000000 00000000 00000011
  4的二进制:00000000 00000000 00000000 00000100
  3 ^ 4:         00000000 00000000 00000000 00000111,结果是:7
~按位非~ A将A的二进制形式的补码的每一位上的数字依次进行 ~ 运算。

运算规则:取反(0,1互换)。
~ 1 = 0~ 0 = 1

~ 3:
  3的二进制:00000000 00000000 00000000 00000011(原码)
                      00000000 00000000 00000000 00000011(补码)
  ~:              11111111   11111111   11111111   11111100(补码取反)
  ~ 3:           10000000 00000000 00000000 00000100(原码),结果是:-4

~ -4:
  -4的二进制:10000000 00000000 00000000 00000100(原码)
                        11111111  11111111   11111111   11111100(补码)
  ~:                00000000 00000000 00000000 00000011(补码取反)
  ~ -4:            00000000 00000000 00000000 00000011(原码),结果是:3

注意:正数的原码,反码,补码都是相同的。
           1. 负数的反码:符号位1不变,其他位按原码取反;
           2. 负数的补码:反码+1;
           3. 负数的原码:符号位1不变,其他位按补码取反,再+1。
<<按位左移A << n 将数字A的二进制形式的每一位数字往左边移动n位,最左边的n位移出即丢弃,最右边空出来的n位则补0。

运算规则:A << n = A * 22

3 << 2:
  3的二进制:00000000 00000000 00000000 00000011
  3 << 2: 00 00000000 00000000 00000000 00001100,结果是:12
>>按位右移A >> n 将数字A的二进制形式的每一位数字往右边移动n位,最右边的n位移出即丢弃,最左边空出来的n位则:若最高位为0补0;若最高位为1补码补1。

运算规则:A >> n = A / 22  (A > 0)

24 >> 2:
  24的二进制:00000000 00000000 00000000 00011000
  24 >> 2:      00000000 00000000 00000000 00000110 00,结果是:6

-24 >> 2:
  -24的二进制: 10000000 00000000 00000000 00011000(原码)
                        11111111  11111111   11111111   11100111(反码)
                        11111111  11111111   11111111   11101000(补码)
  -24 >> 2:     11111111  11111111   11111111   11111010 00(补码右移)
                        10000000 00000000 00000000 00000110(原码),结果是:-6
>>>按位无符号右移A >>> n 将数字A的二进制形式的每一位数字往右边移动n位,最右边的n位移出即丢弃,最左边空出来的n位则无论最高位为0还是1,全部补0。

-24 >>> 2:
  -24的二进制: 10000000 00000000 00000000 00011000(原码)
                        11111111  11111111   11111111   11100111(反码)
                        11111111  11111111   11111111   11101000(补码)
  -24 >>> 2:   00111111  11111111  11111111   11111010 00(补码右移)
                        00111111  11111111  11111111   11111010(正数原码=补码),结果是:1073741818

6 三元运算符

  1. 格式:布尔类型表达式 ? 结果1 : 结果2;

  2. 计算方式:

    1. 布尔类型表达式结果是true:返回结果1;
    2. 布尔类型表达式结果是false:返回结果2。
  3. 案例:求a,b,c三个整数中的最大值:

    public static void main(String[] args) {
    	int a = 100;
    	int b = 200;
    	int c = 300;
    
    	System.out.println((a>b) ? ((a>c) ? a : c) : ((b>c) ? b : c));//300
    }
    
<think>嗯,用户现在想了解第关关于运算符优先级的编程课程练习题。我需要先回顾一下用户提供的引用内容,看看有没有相关的知识点可以应用。引用[1]提到了Python中的运算符类型和优先级顺序,引用[2]、[3]、[4]则涉及C/C++中的运算符优先级例子,尤其是移位运算符和算术运算符的优先级问题。 首先,用户需要的是练习题,可能涉及不同语言,但根据引用内容,既有Python也有C的例子。不过用户的问题可能更偏向于通用的运算符优先级概念,所以练习题应该涵盖常见容易出错的优先级情况,比如算术、移位、逻辑运算符等的混合使用。 然后,我需要确保练习题能够覆盖用户提供的引用中的例子,比如引用[2]中的移位和加法优先级问题,引用[4]中的移位运算结果。同时,引用[3]提到优先级相同的情况下的处理,比如结合方向,比如赋值运算符从右到左的结合性。 接下来,设计练习题的时候,应该包括多个运算符混合的表达式,让用户判断运算顺序和结果。例如,算术运算符与移位运算符的优先级比较,逻辑运算符的短路特性,以及自增运算符在表达式中的处理顺序。 同时,要注意题目的多样性,涵盖不同的运算符类型,比如位运算、逻辑运算、算术运算、赋值运算等,并且结合不同语言的特点,比如Python和C/C++中的不同行为,尤其是像自增运算符在C中的前置和后置区别,这在Python中并不存在,但用户提供的引用中有C的例子,可能需要包括相关内容。 另外,要考虑用户可能的困惑点,比如乘法和移位运算符的优先级高低,逻辑与和逻辑或的优先级,以及括号的使用如何改变优先级。这些都可以作为练习题的重点。 最后,练习题需要提供解析,帮助用户理解运算顺序,特别是引用中提到的知识点,如算术运算符优先级高于移位运算符,或者赋值运算符的结合方向。这样用户在做题时能巩固相关知识,并避免常见错误。</think>### 运算符优先级核心知识点 运算符优先级决定了表达式中运算的执行顺序。以下为常见易错点: 1. **算术运算符**(如$+$, $*$, %)优先级高于**移位运算符**(如$<<$, $>>$) 例如:$1 << 3 + 1$等价于$1 << (3+1) = 16$[^2] 2. **逻辑运算符**中,`&&`优先级高于`||`,但均低于**比较运算符**(如$>$, $==$) 例如:$a > 0 || b < 5 \&\& c == 3$ 会被解析为$(a > 0) || ((b < 5) \&\& (c == 3))$ 3. **赋值运算符**(如$=$, $+=$)优先级最低且从右向左结合 例如:`a = b = 5`等价于`a = (b = 5)` --- ### 运算符优先级练习题 #### 题目1(Python/C++共用) ```python x = 5 print(x << 2 + 1) ``` **问:输出结果是什么?为什么?** **解析**: 表达式等价于$x << (2+1)$,因为加法优先级高于移位。计算过程为$5 * 2^3 = 40$[^2][^4] --- #### 题目2(C语言) ```c int a = 3, b = 2; printf("%d", a++ * b + a); ``` **问:输出结果是多少?说明运算顺序** **解析**: 1. `a++`返回原值3,然后a变为4 2. 计算$3 * 2 = 6$ 3. 最后$6 + 4 = 10$ (注意自增运算符的副作用顺序)[^3] --- #### 题目3(逻辑运算) ```python flag = 5 > 3 or 0 and 7 < 2 ``` **问:flag的值是什么?** **解析**: 运算顺序为$(5>3) \text{ or } (0 \text{ and } (7<2))$,结果$True \text{ or } False = True$ --- #### 题目4(位运算) ```cpp cout << (0xFF & 0x0F << 4); ``` **问:输出结果是多少?** **解析**: 移位运算符优先级高于按位与,等价于$0xFF \& (0x0F << 4) = 0xFF \& 0xF0 = 0xF0$ --- #### 题目5(综合) ```python result = 12 // 5 ** 2 + 3 % 2 << 1 ``` **问:result的值是多少?分步说明** **解析**: 1. 幂运算$5^2=25$ 2. 整除$12//25=0$ 3. 取模$3\%2=1$ 4. 加法$0+1=1$ 5. 左移$1<<1=2$ --- ### 重点总结 1. 遇到复杂表达式时**显式使用括号**是最佳实践 2. 特别注意不同语言中运算符的细微差异(如Python没有自增运算符) 3. 记住四个关键优先级梯队: $$算术 > 移位 > 比较 > 逻辑 > 赋值$$ §§相关扩展问题§§ 1. 如何用运算符优先级解释表达式`*p++`的行为? 2. 为什么`i = i++`在不同语言中可能产生未定义行为? 3. Python中`is`和`==`运算符的优先级关系是怎样的?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值