3.1各类运算

赋值运算

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,而是一个非常大的数,这里一定要注意哦

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值