C语言学习随笔-08 运算符

运算符是一种告诉编译器执行特定的数学或逻辑操作的符号。

C语言中的运算符主要有:

●  算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符、杂项运算符

1、算术运算符:+、-、*、/、%、++、--

 int a = 21;
 int b = 10;
 int c;

 c = a + b;
 printf("Line 1 - c 的值是: %d\n", c);//31
 c = a - b;
 printf("Line 2 - c 的值是: %d\n", c);//11
 c = a * b;
 printf("Line 3 - c 的值是: %d\n", c);//210
 c = a / b;
 printf("Line 4 - c 的值是: %d\n", c);//2
 c = a % b;
 printf("Line 5 - c 的值是: %d\n", c);//1
 c = a++;//赋值后再加1,c为21,a为22
 printf("Line 6 - c 的值是: %d\n", c);//21
 c = a--;//赋值后再减1,c为22,a为21
 printf("Line 7 - c 的值是: %d\n", c);//22
 printf("----------------------------\n");
 //a++与++a的区别
 int cc;
 int aa = 10;
 cc = aa++;
 printf("先赋值后运算:\n");
 printf("Line1 - cc 的值是 %d\n",cc);//10
 printf("Line2 - aa 的值是 %d\n",aa);//11

 aa = 10;
 cc = aa--;
 printf("Line3 - cc 的值是 %d\n", cc);//10
 printf("Line4 - aa 的值是 %d\n", aa);//9

 printf("先运算后赋值:\n");
 aa = 10;
 cc = ++aa;
 printf("Line5 - cc 的值是 %d\n", cc);//11
 printf("Line6 - aa 的值是 %d\n", aa);//11

 aa = 10;
 cc = --aa;
 printf("Line7 - cc 的值是 %d\n", cc);//9
 printf("Line8 - aa 的值是 %d\n", aa);//9

2、关系运算符:(a==b)为假、(a!=b)为真、(a>b)为假、(a<b)为真、(a>=b)为假、(a<=b)为真

 int a = 21;
 int b = 10;
 int c;

 if (a == b)//a不等于b
 {
     printf("a等于b\n");
 }
 else
 {
     printf("a不等于b\n");
 }
 if (a < b)//a不小于b
 {
     printf("a小于b\n");
 }
 else
 {
     printf("a不小于b\n");
 }
 if (a > b)//a大于b
 {
     printf("a大于b\n");
 }
 else
 {
     printf("a不大于b\n");
 }

 /* 改变a和b的值 */
 a = 5;
 b = 20;
 if (a <= b)
 {
     printf("a小于或等于b\n");
 }
 if (b >= a)
 {
     printf("b大于或等于a\n");
 }

3、逻辑运算符:&& -逻辑与、|| -逻辑或、!-逻辑非

      &&:如果两个数都非零,则为真,否则为假
      ||:如果两个数中有一个数非零,则为真,否则为假
      !:把条件为真的变为假

 int a = 5;
 int b = 20;
 int c;

 if (a && b)
 {
     printf("Line1 - 条件为真\n");
 }
 if (a || b)
 {
     printf("Line2 - 条件为真\n");
 }

 /* 改变a和b的值 */
 a = 0;
 b = 10;
 if (a && b)
 {
     printf("Line3 - 条件为真\n");
 }
 else
 {
     printf("Line3 - 条件为假\n");
 }
 if (!(a && b))
 {
     printf("Line4 - 条件为真\n");
 }

4、位运算符:位运算符作用于二进制的位,并逐位执行操作

 &(与)、|(或)、^(异或)、~(取反)、<<(左移)、>>(右移)
 x=0,y=0:x&y=0,x|y=0,x^y=0
 x=0,y=1:x&y=0,x|y=1,x^y=1
 x=1,y=1:x&y=1,x|y=1,x^y=0
 x=1,y=0,x&y=0,x|y=1,x^y=1

 A = 00111100;
 B = 00001101;

 A & B = 00001100;
 A | B = 00111101;
 A ^ B = 00110001;
 ~A = 11000011;


       ▷  & 与运算符:对两个操作数的每一位执行逻辑与操作,如果位都为1,则结果为1,否则为0

  0 & 0 = 0;
  0 & 1 = 0;
  1 & 0 = 0;
  1 & 1 = 1;
  A & B = 00001100;


        ▷  | 或运算符:对两个操作数的每一位执行逻辑或操作,如果1位都为0,则结果为0,否则为1

  0 | 0 = 0;
  0 | 1 = 1;
  1 | 0 = 1;
  1 | 1 = 1;
  A | B = 00111101;


        ▷ ^ 异或运算符:对两个操作数的每一位执行异或操作,如果两个相应的位值相同,则结果为0,否则为1

  0 ^ 0 = 0;
  0 ^ 1 = 1;
  1 ^ 0 = 1;
  1 ^ 1 = 0;
  A ^ B = 00110001;


         ▷  ~ 取反运算符:对操作数的每一位执行取反操作,即每一位的0变为1,1变为0

   ~1 = -2;
   ~0 = -1

   (~A) = 11000011;


         ▷  << 左移运算符:将操作数的所有位向左移动指定的位数。左移n位相当于乘以2的n次方
         二进制左移运算符,将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0)
          A << 2将得到240,即为11110000

         ▷  >> 右移运算符:将操作数的所有位向右移动指定为位数。右移n位相当于除以2的n次方
         二进制右移运算符,将一个运算对象的各二进制位全部右移若干位(正数左补0,负数左补1,右边丢弃)
          A >> 2将得到 15,即为00001111

   unsigned int x = 60;/* 60 = 00111100 */
   unsigned int y = 13;/* 13 = 00001101 */
   int z = 0;

   z = x & y;/* 12 = 00001100 */
   printf("Line 1 - z的值是:%d\n", z);//12

   z = x | y;/* 61 = 00111101 */
   printf("Line 2 - z的值是:%d\n", z);//61

   z = x ^ y;/* 49 = 00110001 */
   printf("Line 3 - z的值是:%d\n", z);//49

   z = ~x;/* -61 = 11000011 */
   printf("Line 4 - z的值是:%d\n", z);//-61

   z = x << 2;/* 240 = 11110000 */
   printf("Line 5 - z的值是:%d\n", z);//240

   z = x >> 2;/* 15 = 00001111 */
   printf("Line 6 - z的值是:%d\n", z);//15

 

5、赋值运算符:

         =     简单的赋值运算符,把右边的值赋值给左边操作数                             
        +=    加且赋值运算符,把右边操作数加上左边操作数的结果赋值给左边操作数
        -=    减且赋值运算符,把左边操作数减去右边操作数的结果赋值给左边操作数
        *=    乘且赋值运算符,把右边操作数乘以左边操作数的结果赋值给左边操作数
        /=    除且赋值运算符,把左边操作数除以右边操作数的结果赋值给左边操作数
        %=    求模且赋值运算符,求两操作数的模赋值给左边操作数
        <<=   左移且赋值运算符
        >>=   右移且赋值运算符
        &=    按位与且赋值运算符
        ^=    按位异或且赋值运算符
        |=    按位或且赋值运算符

  int a = 21;
  int c;

  c = a;//c=21
  printf("Line1, = 运算符实例, c的值 = %d\n",c);

  c += a;//c=c+a
  printf("Line2, += 运算符实例, c的值 = %d\n", c);

  c -= a;//c=c-a
  printf("Line3, -= 运算符实例, c的值 = %d\n", c);

  c *= a;//c=c*a
  printf("Line4, *= 运算符实例, c的值 = %d\n", c);

  c /= a;//c=c/a
  printf("Line5, /= 运算符实例, c的值 = %d\n", c);

  c = 200;
  c %= a;//c=c%a
  printf("Line6, %= 运算符实例, c的值 = %d\n", c);

  c <<= 2;//c=c<<=2
  printf("Line7, <<= 运算符实例, c的值 = %d\n", c);

  c >>= 2;//c=c>>=2
  printf("Line8, >>= 运算符实例, c的值 = %d\n", c);
    
  c &= 2;//c=c&2
  printf("Line9, &= 运算符实例, c的值 = %d\n", c);

  c ^= 2;//c=c^2
  printf("Line10, ^= 运算符实例, c的值 = %d\n", c);

  c |= 2;//c=c|2
  printf("Line11, |= 运算符实例, c的值 = %d\n", c);

 

6、杂项运算符:

      sizeof()      返回变量的大小
      &             &a,将给出变量的实际地址
        *             *a,指向一个变量
        ?:            条件表达式

 int a = 4;
 short b;
 double c;
 int* ptr;

 //sizeof运算符实例
 printf("Line1 - 变量a的大小= %lu\n",sizeof(a));
 printf("Line2 - 变量b的大小= %lu\n",sizeof(b));
 printf("Line3 - 变量c的大小= %lu\n",sizeof(c));
    
 //&和*运算符实例
 ptr = &a;//‘ptr’现在包含‘a’的地址
 printf("a的值是:%d\n",a);
 printf("*ptr是:%d\n",*ptr);

 //三元运算符实例
 a = 10;
 b = (a == 1) ? 20 : 30;
 printf("b的值是:%d\n",b);

 b = (a == 10) ? 20 : 30;
 printf("b的值是:%d\n",b);

 

7、运算符的优先级

        1、后缀         () [] -> . ++ --                       从左到右
        2、一元         + - ! ~ ++ -- (type)* & sizeof        从右到左
        3、乘除         * / %                                  从左到右
        4、加减         + -                                    从左到右
        5、移位         << >>                                  从左到右
        6、关系         < <= > >=                              从左到右
        7、相等         == !=                                  从左到右
        8、位与AND      &                                      从左到右
        9、位异或XOR    ^                                      从左到右
        10、位或OR      |                                      从左到右
        11、逻辑与AND   &&                                     从左到右
        12、逻辑或OR    ||                                     从左到右
        13、条件        ?:                                     从右到左
        14、赋值        = += -= *= %= >>= <<== &= ^= |=        从右到左
        15、逗号        .                                      从左到右

  int a = 20;
  int b = 10;
  int c = 15;
  int d = 5;
  int e;

  e = (a + b) * c / d;    // ( 30 * 15 ) / 5
  printf("(a + b) * c / d的值是:%d\n",e);

  e = ((a + b) * c) / d;  // ( 30 * 15 ) / 5
  printf("((a + b) * c) / d的值是:%d\n",e);

  e = (a + b) * (c / d);  // (30) * (15 / 5)
  printf("(a + b) * (c / d)的值是:%d\n",e);

  e = a + (b * c) / d;    // 20 + ( 150 / 5)
  printf("a + (b * c) / d的值是:%d\n",e);
posted @ 2024-01-15 16:37  啊波波老表  阅读(22)  评论(0)    收藏  举报