运算符
基本运算符
所有数据的处理,通过运算符来实现;
两个整型在一起运算结果还是整型;如果有小数参加运算的,运算结果是双精度小数(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