C语言编程基础----运算符

时间:2022-01-26 00:42:37

运算符

int val = 100;

赋值运算符

=   赋值      int  a =100;

+=     val +=10;  ===> val(新) = val(当前) + 10;   val新值为110     

-=               val -=10;   ==val = 100-10 ;   val的值等于90

*=              val *=10;   ==val = 100*10 ;   val的值等于1000

/=               val/=10;   ==val = 100/10 ;   val的值等于10

val/=9;   ==val = 100/9; (9*111)  val的值等于11

 

%=             val%=9;  ==val = 100%9 ; (1)   val就为1

&=    位与之后赋值     val &= 0x01    ==>  val = val &0x01     

01100100 & 00000001  =00000000

|=     位或之后赋值      val |= 0x01    ==>  val = val | 0x01     

01100100 | 00000001  =01100101

 

^=

 

算术运算符

+   

-   

*   

/   整数相除得到整数部分取整

%   整数相除得到余数部分取余

++  自加1      val++; ===>  val = val +1 ; 也就是得到101

--    自减1     val-- ; ===>   val = val -1 ; 得到是的99

 

++val;   等同于 val ++;这两语句相同,同样是令val自增1

 

if( ++val)  先令val自增1,再判断新值是否为真(非0

if(val++)  先判断val值是否为真, 不管结果如何再令val自增1

 

关系运算符
是用来描述两个数之间的关系

==   是否相等

=   是否不相等

>          a>b 判读a是否大于

<          a<b 判读a是否小于

>=        a>=b 判读a是否大于或等于b

<=        a<=b 判读a是否小于或等于b

 

练习:test1

输入一个小写字符,‘a  ‘z’

显示该字符对应大写字符,连续显示4

输入‘a  ,输出是AAAA  

字符的输入和显示用%c

                char c ;

                scanf(“%c” , &c);

                for( i=0; i<4; i++ )

                printf(“%c”, c-32);

逻辑运算符

逻辑与  &&

条件1&& 条件2

只有这两个条件都满足(条件为真)整个表达式才为真

只要有一个为假就是假

如果条件1已经是假,不会处理条件2

 

例:判断输入的是否为小写字符:

char c ;  

scanf(“%c” , &c);    // a  ‘z’    ‘z’ >= c >= ‘a’ 数学上写法

if(  c >= ‘a’    &&    ‘z’ >= c )


逻辑或  ||

条件1 || 条件2

    只有有一个条件满足(条件为真)整个表达式就为真

    只有这两个条件都不满足(条件都为假)整个表达式才为假

    如果条件1已经是真,不会处理条件2

    if (   小写字符  ||   大写字符  )

    a ~ ‘z’    ‘A’ ~ ‘Z’

    判断一个字符是否为英文字符

        if (  (c >= ‘a’ && ‘z’ >= c )  ||  (c >= ‘A’ && ‘Z’>= c )  )

 

练习 test2.c

输入一个字符,英文字符或者数字字符

如果是小写字符就显示该字符对应大写字符,连续显示4

如果是大写字符或者数字字符就显示输入出错

---------------------------------------------------------------------------- 

scanf(“%c”, &ch)  不管键盘的缓冲区里面有什么数据都会读取之并当成是字符

如果需要清空缓冲区,常用

while(getchar() != ‘\n’) ;  

// getchar()逐个字符取走,得到的就是字符本身

%d只取+-0123456789

%x只取xX0123456789abcdefABCDEF

%s 可以取键盘上所有键值,除了空格和回车

--------------------------------------------------------------------------

 

逻辑非 

    单目运算符 

    !条件     如果条件为真,整个表达式为假

    如果条件为假,整个表达式为真

    非零就是真

    分析: !val

         如果val 的值为1 ,请问 !val  判断结果为假

         如果val 的值为0 ,请问 !val  判断结果为真

    分析   ! (a>b)

         如果a的值为10 b的值为12

             ! (a>b)  a>b不成立,这个表达式是真的

         如果a的值为15 b的值为12

             ! (a>b)  a>b成立,这个表达式是假的


位运算符

   针对bit做操作    1Byte8bits

   位与运算符 &   对应位相与都为1才为1 ,否则为0

        如  unsigned char val = 10;

            val & 0x01 ==    0000 1010

                                        & 0000  0001

                                            0000  0000

 

            1) 用于判断某一位是为1还是0

            如判断一个unsigned char数据的最低位是否为1

                           unsigned char val

                             .........

                        如果 val &0x01 != 0 说明最后一位是1

                        如果 val &0x01 == 0 说明最后一位是0

 

            2)  用来令某一位为0

                如令unsigned char val 的第3位为0

                             val & 0b11110111

 

位或运算符 | 对应位相或都为0才为0 ,否则为1

            如  unsigned char val = 10;

                    val | 0x01 ==     0000 1010

                                                |  0000  0001

                                                    0000  1011

 

              用于把某一位置成1

              如保证unsigned char val 的第4位为1

                 val | 0b00010000

 

左移运算 <<  把数据按要求向左移动指定位数

          直接把高位移走,低位补0

          对数据逐位进行操作

          在数据没有越界的情况下,左移n位就相当于乘以2n

 

右移运算 >>  把数据按要求向右移动指定位数

          直接把低位移走,如果是带符号数高位补符号位(负数补1,正数补0

          如果是无符号数,直接高位补0

          对数据逐位进行操作

          在非负数进行操作的情况下,右移n位就相当于除以2n

 

位异或  ^  

    按二进制位进行比较,如果对应位不相同就为1,相同就为0

    如  unsigned char val = 10;

        val ^ 0x01 ==     0000 1010

                                    ^  0000  0001

                                         0000  1011

        unsigned  char a = 0x12;

        unsigned  char b = 0xab;

        unsigned  char  c = a^b ;===> ?

        unsigned  char  d = c^b ; ===> ?

        unsigned  char  e = c^d ;  

        见图C语言编程基础----运算符

    作用:    1)用来比较全部位数是否相同,只有有一位不相同返回的就是非0

                         如果全部位都相同返回0

                    2)可以实现两数交换

                                                unsigned  char a = 0x12;

                                                unsigned  char b = 0xab;

                                                 a= a^b ;// 新的a值为 0xb9

                                                 b= a^b; // b0x12

                                                 a = a^b;//  a0xab

                        还可以写成:

                                                                a^=b;

                                                                b^=a;

                                                                a^=b;

 

思考:要实现两数的交换,可以想到几种方式?用代码确定效果(3~~4种)

                                    int  a = 0x12;

                                    int  b = 0xab;

 

                                            1) 异或

                                                                a^=b ; b^=a;a^=b;

 

                                            2) 使用额外变量暂存

                                                                  int  temp
                                                                  temp = a ; 
                                                                  a = b ;// b的值赋给 a
                                                                  b = temp   // 把之前 a的值赋给 b

 

                                              3) 利用加减法

                                                                  a = a+b;

                                                                    b = a-b;

                                                                    a = a-b;

 

                                                4) 利用乘除法

                                                                    a = a*b;

                                                                    b = a/b;

                                                                    a = a/b;

 

位反  ~

        把数据的每一位都取反(注意不是反码)

             char val = 100; // 0x64

              ~val ==>   ~0110 0100  == 1001 1011

          常和位与、位或操作配合使用

                        例:要保证val的第3位为0

                                val & 0b11110111  ======val &( ~0x08 )

 

 

其它运算符

sizeof()   计算对应的类型或者是变量所占用的空间大小,以字节为单位

printf( “int  is  %ld Btyet(s) \n”, sizeof(int)) ;

int  a ;

printf( “int  is  %ld Btyet(s) \n”, sizeof(a))

 

确认所有基本数据类型所占用的空间大小

char 1 

short 2

int  4 

float 4 

long 8 

double 8   

long double  16

bool   1         <stdbool.h>

 

常用于数组的大小、结构体等类型大小

 

      C语言唯一的三目运算符

              判断条件 ?条件为真时执行的语句 条件为假时执行的语句

 

例子:用一个表达式得到ab中比较大的值

a>b ? a : b 

a大于b如果是则a : 否则b

 

就是 if ...else....的精简版

ifa>b

max = a;

else

max = b;

 

练习:定义三个同类型变量a,b,c分别赋值;

      通过一个表达式得到最大值,并打印出来

 

  逗号

         int a = (100 , 200);

最终a的值是200,因为()最后为200

 

 

运算符的优先级:

[ ]   ( )

单目运算符

双目算术运算符和<<   >>

双目关系运算符

双目位运算     ( i & 0x01) == 0

双目逻辑运算

三目运算符

赋值运算符