第三课 运算符

运算符

基本运算符

所有数据的处理,通过运算符来实现;

两个整型在一起运算结果还是整型;如果有小数参加运算的,运算结果是双精度小数(double)

1
2
3
3/2    :   1    (舍去小数部分)

3.0/2  :   1.500000(double)

Go

整型运算还是整型

整型和浮点型运算,需要做类型转换

%:取余格式:a%b,a and b 必须为整数!

23 % 6 = 3……5 6 % 23 = 0……6 -23 % 6 = 3……-5 23 % -6 = -3……5

取余的结果一定要与被取余的数符号保持一致。

1
2
3
4
5
int x,y;
scanf("%d,%d",&a,&b);
// x % y : 0     x能被y整除
// x % 2 : 0     x是偶数
// x % 2 : 1     x是奇数

任何参数对 10 取余,得到的都是个位

例题: 从键盘输入一个三位数的整数,交换百位和十位,然后输出

1
2
3
4
int x = 142
x/100 = 1    //   获取百位
x/10%10 = 4  // 	获取十位
142%10       //   获取个位

自加自减

1 ++n; n++;

符号无论在变量的哪一侧,都是实现自身 +1;++ 只能对变量进行运算

1
2
(x+y)++   // 错误
7++       // 错误

2 (++n) and (n++) 的区别

1
2
3
4
5
6
int x = 9,y;
// 分别执行以下语句
y = x++;        // x=10,y=9 
y = ++x;     	  // x=10,y=10
y = ++x + ++x;  // x=11,y=22
y = x-- + x--;  // x=7,y=18

在运算式中如果 ++ 在变量的前面,先做自身 +1, 然后再做其它运算;

如果 ++ 在变量的后面,先做运算后自身 +1;

Go

仅支持 i++,避免歧义。

条件运算符

?: c program 唯一的一个三目运算符

运算格式 表达式1? 表达式2 :表达式3;

表达式1的值,如果它的值是非0(条件成立),那么运算结果就是表达式2的值;

如果表达式1的值为0(条件不成立),这时运算结果就是表达式3的值。

1
2
2<3? 3>4? 2+6 : 2-5 : 2+3       //第一个问号和最后一个冒号外嵌套
2<3? (3>4? 2+6 : 2-5) : 2+3     // -3

a > b? a : b; 取a/b最大值

eg:从键盘输入 4 门课考试成绩,求最低分

1
2
3
4
5
6
float a,b,c,d,mix;

mix = a;
mix = (mix<b)? mix:b;     // 注意判断取大小值的符号
mix = (mix<c)? mix:c;
mix = (mix<d)? mix:d;

判断大小,用 ?: 比 if 语句优势

Go

不支持三目运算符,从以上语法中也能看出,复合三目运算极为复杂,难读。

关系运算符

作用:比较两个对象之间量的大小关系

常见:< <= > >= == !=

注:新手常常错在 == 和 = 号上,总是误将判断写成赋值;

关系运算的结果:True(1) and False(0)(成立 or 不成立)

1
2
3
4
5
int x,y=1,z=4;

x = y == z;  // y==z:0     x = 0
x = y = z;   // y=4; x=4;    x=4    赋值符号 自右向左
x = y != z;  // y!=z:1;    x=1

赋值符号左侧只能为变量,不能为表达式

逻辑运算符 (小心短路)

1 作用:逻辑推理或逻辑判断时,用于连接推理的条件。

运算符有三个:

  • 逻辑与 && 要所有条件都成立,推理才成立
  • 逻辑或 || 只要一个条件成立,推理就成立
  • 逻辑非 取反( !(2>3) : 2<=3 )

2 && and || (小心短路)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
x>=10 && x<=100;  // lvalue 不成立 rvalve 不执行  10<=x<=100
x>10 || x<-100;   // lvalue 成立则 rvalue 不判断

/* 表达小写字母 */
char n;
scanf("%c",&n);
n>='a' && n<='z';
/*   n>=97  && n<=122;  */      
(n>='a' && t<='z') || (n>='A' && n<='Z')  // 判断是否在字母范围

/* 短路求值例题 */
int a=2,b=3,x;       
x = (++a>=b) && (a<b++)  // a=3;b=4;x=0
x = (++a>b)  && (a<b++)  // a=3;b=3;x=0
x = (++a>=b) && (a<++b)  // a=3;b=4;x=1
x = (++a>=b) || (a<++b)  // a=3;b=3;x=1
x = (++a>b)  || (a<++b)  // a=3;b=4;x=1

3 逻辑真 与 逻辑假(布尔运算)

4 小结

  • 如果在 a&&b 运算中 a 的值为0,计算机就不会再处理 b 的值。
  • 如果在 a || b 运算中,如果 a 条件成立,计算机不会再处理b

eg:表示非数字符号

1
2
3
4
5
6
7
8
char x;

x = getchar();
/* 数字符号 */
x>='0' && x<='9'     // 等同于 x>=48 && x<=57

/* 非数字符号 */
!(x>='0' && x<='9')

类型强制运算符

不按照自然运算规律进行,按照设计程序员的要求进行类型转换。

格式:(强制类型)(强制对象)

1
2
3
(int)2.3+8.9    // 10.9
(int)(2.3+8.9)  // 11
(int)(8.9)      // 错误  类型强制转换符不能用于常量

类型长度计算(存储占用字节)

sizeof()

格式:sizeof(运算式/具体类型/数组)

1
2
sizeof(3.0/2);   // = 8(double)
sizeof('a'+1);   // = 4(int)

char 是一个字节,字符串多一个’\0’,获取元素个数需要除以单字节。

Go

unsafe.Sizeof(any)

逗号运算符

格式:表达式1,表达式2,表达式3,

从表达式1开始计算,一直计算到表达式 n,最后把表达式 n 作为运算结果。

1
2
x = (1,2,3);          // x=3
x = (z=1, y=2, x+y);  // x= x+y =3

Go

x,y,z = 1,2,3

Licensed under CC BY-NC-SA 4.0
本文阅读量 次, 总访问量 ,总访客数
Built with Hugo .   Theme Stack designed by Jimmy