• C基础-操作符详解


    操作符分类:

    算数操作符:+ - * / %

    1. //算数操作符
    2. // int main()
    3. // {
    4. // // /除法 1.整数除法(除号两端都是整数) 2浮点数除法,除号的两端只要有一个小数就执行小数除法
    5. // // 除法中,除数为0
    6. // int a = 7 / 2;
    7. // printf("%d\n",a); //3
    8. // double b = 7 / 2;
    9. // printf("%lf\n",b); //3.000000
    10. // double c = 7 / 2.0;
    11. // printf("%lf\n",c); //3.500000
    12. // int d = 0;
    13. // int e = 5 / d; //除数不可为0,编译器会报错
    14. // printf("%d\n",e);
    15. // return 0;
    16. // }
    17. int main()
    18. {
    19. int a = 17 % 8; //% 得到数整数的余数
    20. //int b = 17.0 % 8.0; // %取模操作符的两个操作数必须都是整数才行
    21. printf("%d\n",a);
    22. return 0;
    23. }

    移位操作符:<< >>

    1. //移位操作符
    2. // <<左移操作符
    3. // >>右移操作符
    4. //注意:以为操作符的操作数只能是整数 移动的是二进制
    5. int main()
    6. {
    7. //int a = 15;//00000000000000000000000000001111 -原码 //00000000000000000000000000001111 -反码 //00000000000000000000000000001111 -补码
    8. //int c = -15; //10000000000000000000000000001111 -原码 //11111111111111111111111111110000 -反码(原码的符号位不变,其他位按位取反) 11111111111111111111111111110001 -补码(反码+1就是补码)
    9. //int b = a >> 1;//移动的就是a中的二进制信息 //0000000000000000000000000000111 - 7
    10. //右移:算术右移(右边丢弃,左边直接补原来的符号位) 逻辑右移(右边丢弃,左边直接补0)
    11. // C语言没有明确规定是算术右移还是逻辑右移
    12. //int c = a << 1;//00000000000000000000000000011110
    13. //整数的二进制表示形式 : 原码 反码 补码
    14. //正整数的原码、反码、补码是相同的
    15. //负的整数原码、反码、补码是要计算的
    16. //首先不管是正整数还是负整数都可以写出二进制原码 1.根据正负直接写出的二进制序列就是原码
    17. //1个整型是4个字节 = 32bit位
    18. //整数在内存中存储的是补码
    19. //计算的时候也是使用补码计算的
    20. // printf("%d\n",b); //7
    21. // printf("%d\n",c); //30
    22. // int d = -15; //10000000000000000000000000001111
    23. // int e = d >> 1;//11111111111111111111111111110001 -> 11111111111111111111111111111000 -> 11111111111111111111111111110111 ->00000000000000000000000000001000
    24. // printf("%d\n",e);
    25. //!移位操作符不要移负数哦
    26. int a = 6;// 110
    27. int b = a << 1;//1100
    28. printf("%d\n",b); //12
    29. return 0;
    30. }

    位操作符:& | ^

    1. //位操作符
    2. //也是操作二进制位
    3. // &
    4. // int main()
    5. // {
    6. // int a = 3; //00000000000000000000000000000011
    7. // int b = -5;//10000000000000000000000000000101 11111111111111111111111111111010 补码11111111111111111111111111111011
    8. // int c = a & b;
    9. // // & -- 对应二进制位,有0则为0,两个同时为1才是1
    10. // //00000000000000000000000000000011
    11. // //11111111111111111111111111111011
    12. // //00000000000000000000000000000011 -补码
    13. // printf("%d\n",c); //3
    14. // return 0;
    15. // }
    16. //|
    17. // int main()
    18. // {
    19. // int a = 3; //00000000000000000000000000000011
    20. // int b = -5;//10000000000000000000000000000101 11111111111111111111111111111010 补码11111111111111111111111111111011
    21. // int c = a | b;
    22. // // | -- 对应二进制位,有1则为1,两个同时为0才是0
    23. // //00000000000000000000000000000011
    24. // //11111111111111111111111111111011
    25. // //11111111111111111111111111111011 -补码
    26. // //11111111111111111111111111111010
    27. // //10000000000000000000000000000101 -5
    28. // printf("%d\n",c); //-5
    29. // return 0;
    30. // }
    31. //^
    32. int main()
    33. {
    34. int a = 3; //00000000000000000000000000000011
    35. int b = -5;//10000000000000000000000000000101 11111111111111111111111111111010 补码11111111111111111111111111111011
    36. int c = a ^ b;
    37. // ^ -- 对应二进制位,相同为0,相异为1
    38. //00000000000000000000000000000011
    39. //11111111111111111111111111111011
    40. //11111111111111111111111111111000 -补码
    41. //11111111111111111111111111110111
    42. //10000000000000000000000000001000
    43. printf("%d\n",c); //-8
    44. return 0;
    45. }
    46. //不能创建临时变量,实现两个整数的交换
    47. int main()
    48. {
    49. int a = 3;
    50. int b = 5;
    51. printf("交换前: a=%d b=%d\n",a,b);
    52. // int tmp = a;
    53. // a = b;
    54. // b = tmp;
    55. // a = a + b;
    56. // b = a - b;
    57. // a = a - b; 超过整形最大存储则不行
    58. //a ^ a -> 0
    59. //a ^ 0 = a
    60. // 异或是支持交换律的
    61. //a ^ b ^ a = 5
    62. //a ^ a ^ b = 5
    63. a = a ^ b;
    64. b = a ^ b; // b = a ^ b ^ b = a
    65. a = a ^ b;// a = a ^ b ^ a = b
    66. printf("交换后: a=%d b=%d\n",a,b);
    67. return 0;
    68. }

    编写代码实现:求一个整数存储在内存中的二进制中1的个数

    1. //编写代码实现:求一个整数存储在内存中的二进制中1的个数
    2. //方法1
    3. // int main()
    4. // {
    5. // //整数有32个bit位
    6. // //获得32个bit位的每一位,
    7. // //判断这一位是否为1
    8. // //是1就是记数器+1
    9. // int num = 10;
    10. // int count = 0;
    11. // while (num)
    12. // {
    13. // if (num%2 == 1)
    14. // {
    15. // count++;
    16. // }
    17. // num = num/2;
    18. // }
    19. // printf("二进制中1的个数 = %d\n",count);
    20. // return 0;
    21. // }
    22. //方法2
    23. int main()
    24. {
    25. int num = 10;
    26. int i = 0;
    27. int count = 0;
    28. for(i=0;i<32;i++)
    29. {
    30. if (num & (1 << i))
    31. {
    32. count++;
    33. }
    34. }
    35. printf("二进制中1的个数 = %d\n",count);
    36. return 0;
    37. }

    赋值操作符: = +=  -=  *= /= ....

    1. //赋值操作符
    2. int main()
    3. {
    4. int weight = 120;//体重
    5. weight = 89; //不满意就赋值
    6. double salary = 10000.0;
    7. salary = 20000.0;
    8. int a = 10;
    9. int x = 0;
    10. int y = 20;
    11. a = x = y+1;//连续复制
    12. return 0;
    13. }

    单目操作符: ! sizeof + -  ~ & *

    1. //单目操作符
    2. // int main()
    3. // {
    4. // int flag = 5;
    5. // if(flag == 0)
    6. // {
    7. // printf("hehe\n");
    8. // }
    9. // if(!flag) //flag为假打印hehe
    10. // {
    11. // printf("hehe\n");
    12. // }
    13. // if(flag)
    14. // {
    15. // printf("haha\n");
    16. // }
    17. // return 0;
    18. // }
    19. //单目操作符只有一个操作数
    20. // int main()
    21. // {
    22. // int a = 5;
    23. // int b = -a;
    24. // printf("%d\n",b);
    25. // return 0;
    26. // }
    27. //& * 应用于指针
    28. // int main()
    29. // {
    30. // int a = 10;
    31. // //pa是指针变量
    32. // int* pa = &a; // &-取地址操作符 取出a的地址
    33. // *pa = 20; //解引用操作符(间接访问操作符)-单目操作符-通过pa中存放的地址,找到指向的空间(内容)
    34. // int c = *pa;
    35. // printf("%d\n",c);
    36. // return 0;
    37. // }
    38. //sizeof 不是函数,是操作符号
    39. //sizeof 计算的是类型创建变量的大小,单位是字节
    40. // int main()
    41. // {
    42. // int a = 10;
    43. // double b = 10.0;
    44. // printf("%d\n",sizeof(int));//4
    45. // printf("%d\n",sizeof(a));//4
    46. // printf("%d\n",sizeof(b));//8
    47. // return 0;
    48. // }
    49. // int main()
    50. // {
    51. // int arr1[10];
    52. // printf("%d\n",sizeof(arr1)); //40 计算整个数组的大小,单位字节
    53. // printf("%d\n",sizeof(int [10])); //40
    54. // int arr2[20];
    55. // printf("%d\n",sizeof(arr2));//80
    56. // return 0;
    57. // }
    58. // ~ 按位取反 按补码二进制位取反
    59. // int main()
    60. // {
    61. // int a = 0;
    62. // printf("%d\n", ~a);
    63. // //00000000000000000000000000000000
    64. // //11111111111111111111111111111111 -补码
    65. // //11111111111111111111111111111110
    66. // //10000000000000000000000000000001 -1
    67. // return 0;
    68. // }
    69. // int main()
    70. // {
    71. // int a = 13;
    72. // //00000000000000000000000000001101
    73. // //00000000000000000000000000010000
    74. // a |= (1<<4);
    75. // //00000000000000000000000000011101
    76. // //11111111111111111111111111101111
    77. // //00000000000000000000000000001101
    78. // printf("%d\n",a); //29
    79. // a &= (~(1 << 4));
    80. // printf("%d\n",a);
    81. // return 0;
    82. // }
    83. // int main()
    84. // {
    85. // int a = 0;
    86. // //scanf 读取失败返回的是EOF
    87. // //假设scanf读取失败了,返回了EOF ---> -1
    88. // //while (scanf("%d",&a) != EOF)
    89. // while(~scanf("%d",&a)) //~ -1为false
    90. // {
    91. // printf("%d\n",a);
    92. // }
    93. // return 0;
    94. // }
    95. // --前置、后置--
    96. //++前置 、后置++
    97. // int main()
    98. // {
    99. // int a = 1;
    100. // int b = a++; //后置++,先使用,后++
    101. // //int c = ++a; //先置++ ,先++在使用
    102. // printf("b=%d a=%d\n",b,a);
    103. // int c = 1;
    104. // int e = c--; //后置--,先使用,后--
    105. // printf("e=%d c=%d\n",e,c);
    106. // return 0;
    107. // }
    108. //强制类型转换
    109. int main()
    110. {
    111. int a = (int)3.14; //强制转换
    112. printf("%d\n",a);
    113. // int a = int(3.14) //err
    114. return 0;
    115. }
    116. void test1(int arr[]) //int* 4/8个字节
    117. {
    118. printf("%d\n",sizeof(arr));
    119. }
    120. void test2(char ch[]) //char* 4/8个字节
    121. {
    122. printf("%d\n",sizeof(ch));
    123. }
    124. int main()
    125. {
    126. int arr[10] = {0};
    127. char ch[10] = {0};
    128. printf("%d\n",sizeof(arr)); //40
    129. printf("%d\n",sizeof(ch)); // 10
    130. test1(arr); // x86上是4 ,x64上是8
    131. test2(ch); // x86上是4 ,x64上是8
    132. return 0;
    133. }

    关系操作符: > < >= <= =.  !=.    关系操作符只能应用到适合的类型上

    1. int main()
    2. {
    3. int a = 0;
    4. int b = 0;
    5. scanf("%d %d",&a ,&b);
    6. if(a == 5 && b ==5)
    7. {
    8. printf("hehe\n");
    9. }
    10. if(a == 5 || b ==5)
    11. {
    12. printf("haha\n");
    13. }
    14. return 0;
    15. }
    16. int main()
    17. {
    18. int y = 0;
    19. scanf("%d",&y);
    20. //判断是否是闰年 1.能被4整除,并且不能被100整除
    21. //2 .能被400整除是闰年
    22. if(((y%4==0) && (y%100!=0)) || (y%400==0))
    23. {
    24. printf("y=%d是闰年\n",y);
    25. }
    26. else
    27. {
    28. printf("不是闰年");
    29. }
    30. return 0;
    31. }

    逻辑操作符:&& 逻辑与 并且   || 逻辑或 或者

    1. int main()
    2. {
    3. int i = 0, a = 0, b = 2, c = 3, d =4;
    4. //i = a++ && ++b && d++;
    5. //printf("a = %d\n b = %d\n c = %d\n d = %d\n",a,b,c,d);//1 2 3 4
    6. i = a++ || ++b ||d++;
    7. printf("a = %d\n b = %d\n c = %d\n d = %d\n",a,b,c,d);//1 3 3 4
    8. return 0;
    9. }

    条件操作符:? :

    1. //条件操作符也叫三目操作符 有三个操作数 exp1 ? exp2 : exp3
    2. //双目操作符 a+b
    3. //单目操作符 !a
    4. // int main()
    5. // {
    6. // int a = 0;
    7. // int b = 0;
    8. // // if (a > 5)
    9. // // {
    10. // // b = 3;
    11. // // } else
    12. // // {
    13. // // b = -3;
    14. // // }
    15. // //(a > 5) ? (b = 3) : (b = -3);
    16. // b = (a > 5) ? 3 : -3;
    17. // printf("%d\n",b);
    18. // return 0;
    19. // }
    20. int main()
    21. {
    22. int a = 0;
    23. int b = 0;
    24. scanf("%d %d",&a,&b);
    25. int m = (a > b) ? a : b;
    26. printf("%d\n",m);
    27. return 0;
    28. }

    逗号表达式 :    ,

    1. //exp1,exp2,exp3,....expN
    2. //逗号表达式 : 从左向右计算,整个表达式的结果是最后一个表达式的结果
    3. // int main()
    4. // {
    5. // int a = 1;
    6. // int b = 2;
    7. // int c = (a>b, a = b+10 ,a,b=a+1); //13
    8. // printf("%d\n",a); //12
    9. // printf("%d\n",b); //13
    10. // printf("%d\n",c); //13
    11. // return 0;
    12. // }
    13. // int main()
    14. // {
    15. // // a = get_val();
    16. // // count_val(a);
    17. // // while (a > 0)
    18. // // {
    19. // // //业务处理
    20. // // a = get_val();
    21. // // count_val(a);
    22. // // }
    23. // //使用逗号表达式
    24. // while (a = get_val(),count_val(a), a>0)
    25. // {
    26. // //业务处理
    27. // }
    28. // return 0;
    29. // }

    下标引用,函数调用和结构成员:  []. ().  .  ->  

    [] 下标引用操作符

    操作数:一个数组名+一个索引值

    1. //[] 下标引用操作符
    2. // int main()
    3. // {
    4. // int arr[10] = {1,2,3,4};
    5. // //数组的起始是有下标的,下标是从0开始的
    6. // printf("%d\n",arr[2]); //arr 和 2是[]的两个操作数
    7. // return 0;
    8. // }

    ()函数调用操作符

    接受一个或者多个操作数:第一个操作数是函数名,剩余的操作数就是传递给函数的参数

    1. // return 0;
    2. // }
    3. int Add(int x,int y)
    4. {
    5. return x + y;
    6. }
    7. //函数调用操作符
    8. int main()
    9. {
    10. int len = strlen("abc"); //()函数调用操作符
    11. //()的操作数是:strlen 函数名 "abc" 实参
    12. printf("%d\n",len);
    13. int c = Add(3,5);
    14. printf("%d\n",c);
    15. //对于函数调用操作符来说,最少有1个操作数
    16. return 0;
    17. }

    访问一个结构的成员

    . 结构体,成员名

    -> 结构体指针 -> 成员名

    结构体 -复杂类型  -自定义类型

    1. //可变参数列表 -参数的个数是变化的 -探索
    2. struct Book
    3. {
    4. char name[30];
    5. char author[20];
    6. float price;
    7. };
    8. void Print(struct Book * p)
    9. {
    10. //printf("%s %s %f\n",(*p).name,(*p).author,(*p).price);
    11. printf("%s %s %f\n",p->name,p->author,p->price);
    12. // ->
    13. //结构指针->成员名 p->name
    14. }
    15. int main()
    16. {
    17. struct Book b1 = {"C语言","ccc",66.8f};//书
    18. struct Book b2 = {"Java入门","jjj",55.8f}; //书
    19. Print(&b1);
    20. //printf("%s %s %f\n",b1.name,b1.author,b1.price);
    21. //printf("%s %s %.1f\n",b2.name,b2.author,b2.price);
    22. //结构体变量,成员名
    23. return 0;
    24. }

    表达式求值

    表达式求值的顺序一部分是由操作符的优先级和结核性决定。

    同样,有些表达式的操作数在求值的过程中困难需要转化为其他类型

    1. //表达式求值
    2. //1表达式在计算的过程中,有哪些类型转换?
    3. //2表达式的求值顺序是怎么样的
    4. //类型转换 1整型提升 2算术转换
    5. //整形提升 C的整型算术运算总是至少一缺省整型类型的精度来进行的 为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升
    6. int main()
    7. {
    8. char c1 = 5;
    9. //00000000000000000000000000000101
    10. //00000101 - c1
    11. char c2 = 127;
    12. //00000000000000000000000001111111
    13. char c3 = c1 + c2; // -124
    14. //00000000000000000000000000000101
    15. //00000000000000000000000001111111
    16. //00000000000000000000000010000100
    17. //%d - 10进制的形式打印有符号的整数
    18. //11111111111111111111111110000100
    19. //10000000000000000000000001111100 -124
    20. printf("%d\n",c3);
    21. return 0;
    22. }

    1. // %u 打印10进制的形式无符号的整数
    2. // int main()
    3. // {
    4. // char c = 1;
    5. // printf("%u\n",sizeof(c)); //1
    6. // printf("%u\n",sizeof(+c)); //1
    7. // printf("%u\n",sizeof(-c)); //1
    8. // return 0;
    9. // }
    10. // int main()
    11. // {
    12. // float f = 3.14;
    13. // int a = 10;
    14. // char b = a + f; // 13
    15. // int c = a + f; // 13
    16. // printf("%d\n",b);
    17. // printf("%d\n",c);
    18. // return 0;
    19. // }
    20. //相邻操作符优先级高的先算,低低后算
    21. //相邻操作符的优先级相同的情况下,结合性起作业
    22. // int main()
    23. // {
    24. // int a = 2 + 3 * 5;
    25. // return 0;
    26. // }
    27. // int main()
    28. // {
    29. // int i = 10;
    30. // i = i-- - --i * (i = -3) * i++ + ++i;
    31. // printf("i = %d\n", i);
    32. // return 0;
    33. // }
    34. int fun()
    35. {
    36. static int count = 1;
    37. return ++count;
    38. }
    39. int main()
    40. {
    41. int answer;
    42. answer = fun() - fun() * fun(); // 2 - 3*4 -10
    43. printf("%d\n",answer); //输出多少
    44. return 0;
    45. }

  • 相关阅读:
    element plus Message方法手动关闭,close方法使用
    无良软件测试培训机构,退退退
    Java使用lowagie根据模版动态生成PDF(无需额外设置系统字体)
    Vulnhub_Noob
    赴日IT培训 日本IT行业为啥吃香?
    SpaceX间接「颠覆」了手机?星链如何直连手机通信?
    异常排查 | 重复Cookie访问导致HTTP请求引发空指针异常
    Java开源工具库使用之Lombok
    7-4 USB接口的定义 (10分)
    [题]宝物筛选 #单调队列优化
  • 原文地址:https://blog.csdn.net/qq_61658398/article/details/132829799