赋值运算
1.把右边的赋值给左边的变量,赋值从右向左
int i,j,k;
i = j = k = 0;//可以,但不推荐
2.左边必须是一个左值(变量),不能是常数或者表达式
0 = i;
i + j = 0; 都是错误的
3.赋值可以和其它运算符结合使用,又称复合赋值
i += 3; // i = i + 3
4. = 代表赋值, ==代表相等
举例:
a = b = c =200;// 可以
a+b = c; //不可以
(a = b) = 300; //不可以,(a = b)会被视为表达式
算术运算
加减乘 + - *
除(/)和取模(%)
正数相除,保留整数,遇到浮点数转浮点数:5/2 = 2 5/2.0 = 2.5
对0做/和%都会中断程序,/0.0会得到无穷大(inf)
%只能用于整数,浮点数不支持
%的正负号与%前面数字的正负号相同
不能对浮点数求余数
-7%3为负,7%-3为正
/ 的正负号只要一个数是负数则为负,两个都为负则为正
练习:
输入一个秒数,输出h小时m分s秒
3600 -> 1小时0分0秒
1小时 = 3600秒
1小时 = 60分钟
1分钟 = 60秒
#include <stdio.h>
int main(void){
int b;
printf("请输入一个秒数");
scanf("%d",&b);
printf("%dh-%dm-%ds\n", second/3600, second%3600/60,second%60);
return 0;
}
自增自减运算
1.++/--,变量自增/自减1,不能用于常数5++; //错误
2.整型实型均可自增减,但主要用于整型
3.前缀++/--n,先自增减后做运算
4.后缀 n++/--,先运算,后自增减
5. i、i++、++i,从内存上来说是同一块内存区域
6. i++/++i最好单独作为一个语句出现
关系运算
大于> 大于等于>=
小于< 小于等于
等于 == 和不等于!=
关系表达式的值是真和假,分别用1和0表示
不要进行连续的关系运算,如: 5<4<3
计算5<4<3时,先计算5<4为假,即为0,此时0与3做比较,0<3,顾为真,所以 5<4<3在系统编辑运算后为真
需要写为:5 < 4 && 4 < 3
逻辑运算
1.计算机中的真就是非0(包括1),假用0来表示
2.与(&&)、或(||)、非(!)
与:并且,全真则真,否则为假
或:或者,全假为假,否则为真
非:反之,非真即假,非假即真
3.逻辑表达式的值是真和假,分别用1和0表示
4.短路与:若一个表达式为假,则结果为假,后面的表达式不再计算
C = A && B
5 > 3 && (a = 100); //为真,且a会被赋值100
5 < 3 && (a = 200); //5 < 3为假,则后边a = 200不会做运算,a还是100
5 > 3 || (a = 300); // 5>3为真,或后边的表达式不做运算,即a还是100
5.短路或:若第一个表达式为真,则结果为真,后边表达式不再计算
C =A || B
条件运算和逗号运算
条件表达式?表达式1:表达式2;
若条件表达式为真,则整个表达式的值取表达式1的值,否则取2的值,二取一,另外一个不做运算
表达式1,表达式2,表达式3,……,表达式n
依次计算各表达式的值,以表达式n的值作为整个表达式的值
并不是在所有逗号出现的地方都是逗号表达式
int a = 2,b = 4,c = 6, x, y; //不是逗号表达式
int i = 2, j = 4, k = 6, x, y;
y = (x = i + j, j + k)
printf("%d, %d\n",x,y); 6, 10
y = (x += 10, ++x);
printf("%d, %d\n",x,y); 17, 17
取地址和解引用运算
取地址运算(&),根据变量得到的变量的内存首地址
int a = 233;
printf("%p\n",&a); //打印地址
解引用运算(*),根据变量内存首地址取得变量值
int a = 233;
printf("%p\n", &a);
printf("%d\n",*&a); // 233
*&a = 234;
位运算
1.位与(&)
参与运算的两位都是1结果为1,否则为0
位与可以置某一位为0,也可以得到某一位的值
2.位或(|)
参与运算的两位都是0,结果为0,否则为1
位或可以置某一位为1,也可以得到某一位的值
3.异或(^)
参与运算的两位相异为1,否则为0
异或可以翻转某一位,想翻哪位哪位为1,其余为0
4.位反(~)
1变0,0变1
~0x5a =
5.左移位:
6.右移位: >>
7.在不发生高位溢出的前提下,左移1位相当于乘以2
00001111 << 1 = 00011110
15 30
8.右移1位相当于除以2
00001111 >> 1 = 00000111
15 7
提问:为什么~0x5A 是 0xFFFFFFA5
因为0x5a,没有后缀,默认是int类型(见2.2整型类型)
范例代码如下:
#include <stdio.h>
int main(void){
char a = 0x5a; //0101 1001 89
char b = a << 2; // 0110 0100 90
char d = a << 1; // 1011 0010 -78
short c = a << 2; // 0000 0001 0110 0100 256
short e = a << 1; // 0000 0000 1011 0010 178
printf("%#x,%#x,%#x,%#x,%#x\n",a,b,d,c,e);
printf("%d,%d,%d,%d,%d",a,b,d,c,e);
a = 0xa5; //此时符号位为1
b = a>> 2;//b = 10100101 >>2 = 1110 1001
printf("%#x,%#x\n",a, b); // 0XFFFFFFA5, 0XFFFFFFE9
printf("%#hhx,%#hhx\n",a, b);
return 0;
}
提问:为什么%#x,a,b是0XFFFFFFA5, 0XFFFFFFE9?
首先,a,b是负数,a == -91,而%#x占位符是以32位4字节的形式储存并输出,即让-91以4字节32位的形式保存,则是0XFFFFFFA5
练习:输入一个char整数,以二进制形式打印输出
//输入一个整数以二进制形式打印输出
#include <stdio.h>
int main(void){
printf("输入一个整数[-128 - 127]");
char c;
scanf("%hhd",&c); //85 0101 0101
printf("转换为二进制");
unsigned char mask = 128; //1000 0000
printf("%c", c & mask ? '1' : '0'); //打印字符0,85最高位0
mask = mask >> 1;
printf("%c", c & mask ? '1' : '0'); //打印字符1,85最高位0
mask = mask >> 1;
printf("%c", c & mask ? '1' : '0'); //打印字符0,85最高位0
mask = mask >> 1;
printf("%c", c & mask ? '1' : '0'); //打印字符1,85最高位0
mask = mask >> 1;
printf("%c", c & mask ? '1' : '0'); //打印字符0,85最高位0
mask = mask >> 1;
printf("%c", c & mask ? '1' : '0'); //打印字符1,85最高位0
mask = mask >> 1;
printf("%c", c & mask ? '1' : '0'); //打印字符0,85最高位0
mask = mask >> 1;
printf("%c", c & mask ? '1' : '0'); //打印字符1,85最高位0
mask = mask >> 1;
return 0;
}
在后边引入while后则可简化为:
#include <stdio.h>
int main(void){
printf("请输入[-127,128]之间的数:");
char c;
scanf("%hhd",&c);
unsigned char b = 128;
while(b){
printf("%c",c & b?'1':'0');
b = b >> 1;
}
return 0;
}
运算符优先级
1.单目高于双目
2.乘除高于加减
3.算术高于关系高于逻辑
4.条件高于赋值高于逗号
5.运算符的结合序
多数运算符具有左结合序
a - b + c 等价于 (a - b) + c
单目、三目和赋值运算符具有右结合序
- - - - - a 等价于 -(- -(- - a))
a > b ? a : c > d ? c : d 等价于 a > b ? a : (c > d ? c : d)
a = b += c 等价于 a = (b += c)
类型转换运算
隐式转换:gcc帮你自动转换,先转换后运算
-小转大,整转浮点,有符号转无符号
显示类型转换:
-目标类型变量 = (目标类型)源类型变量
类型转换实际是建立了一个新的目标类型的匿名变量(临时变量),源类型变量在转换前后保持不变
sizeof(1 ? 1:0.9) 有0.9,转double
-7 + 3u > 0; 为1 但是-7的无符号数不是7,而是一个非常大的数,这里一定要注意哦