操作符详解(全网最详细的操作符详解)上

简介: 操作符详解(全网最详细的操作符详解)

操作符种类繁多,本文将帮助大家详尽地遍历一边所有的操作符,希望对大家有所帮助!


8c1475d5657e01d62e566b75fd74b8a1_2a0cf14062ba405caea0fc4e18772206.jpeg


1.操作符分类


算术操作符

移位操作符

位操作符

赋值操作符

单目操作符

关系操作符

逻辑操作符

条件操作符

逗号表达式

下标引用、函数调用和结构成员


2.算数操作符


+    -   *   /   %


需要注意的是:


1. 除了 % 操作符之外,其他的几个操作符可以作用于整数和浮点数。


2. 对于 / 操作符如果两个操作数都为整数,执行整数除法。而只要有浮点数执行的就是浮点数除法。


3. % 操作符的两个操作数必须为整数。返回的是整除之后的余数。


3.移位操作符


<<左移操作符


>> 右移操作符  


注:移位操作符的操作数只能是整数。


3.1 左移操作符


移位规则:左边抛弃,右边补零。


e665c3f1cfa659a7c4fecb1962fccdc2_ecf64597c4db427983d0b454fab57aa9.png


3.2右移操作符


移位规则: 首先右移运算分两种:


1. 逻辑移位 左边用0填充,右边丢弃


2. 算术移位 左边用原该值的符号位填充,右边丢弃


   警告: 对于移位运算符,不要移动负数位,这个是标准未定义的。


75ac9b7c8480b117778d7efa46fcb2a1_7b868a7478ef4597ac2d2819b147df23.png


4.位操作符


& //按位与


| //按位或


^ //按位异或


注:他们的操作数必须是整数。


一道有意思的面试题:


不能创建临时变量(第三个变量),实现两个数的交换。
练习:
#include <stdio.h>
int main()
{
 int a = 10;
 int b = 20;
 a = a^b;
 b = a^b;
 a = a^b;
 printf("a = %d b = %d\n", a, b);
 return 0;
}

也可以通过设置其他的变量作为钥匙,比如:


#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
  int a = 10;
  int b = 20;
  int z;
  z = a ^ b;
  b = z ^ b;
  a = a ^ z;
  printf("a = %d b = %d\n", a, b);
  return 0;
}

这样同样能实现变量的交换。


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


以下是由易到难得几种方法:


#include <stdio.h>
int main()
{
 int num  = 10;
 int count=  0;//计数
 while(num)
 {
 if(num%2 == 1)
 count++;
 num = num/2;
 }
 printf("二进制中1的个数 = %d\n", count);
 return 0;
}
//思考这样的实现方式有没有问题?
//方法2:
#include <stdio.h>
int main()
{
 int num = -1;
 int i = 0;
 int count = 0;//计数
 for(i=0; i<32; i++)
 {
 if( num & (1 << i) )
 count++; 
 }
 printf("二进制中1的个数 = %d\n",count);
 return 0;
}
//思考还能不能更加优化,这里必须循环32次的。
//方法3:
#include <stdio.h>
int main()
{
 int num = -1;
 int i = 0;
 int count = 0;//计数
 while(num)
 {
 count++;
 num = num&(num-1);
 }
 printf("二进制中1的个数 = %d\n",count);
 return 0;
}
//这种方式是不是很好?达到了优化的效果,但是难以想到。

5. 赋值操作符


int weight = 120;//体重

double salary = 10000.0;

salary = 20000.0;//使用赋值操作符赋值。


复合赋值符


如+=,-=,*=等等,这样写更加简洁一些。


6. 单目操作符


!           逻辑反操作
-           负值
+           正值
&           取地址
sizeof      操作数的类型长度(以字节为单位)
~           对一个数的二进制按位取反
--          前置、后置--
++          前置、后置++
*           间接访问操作符(解引用操作符)
(类型)       强制类型转换


6.2 sizeof 和 数组


#include <stdio.h>
void test1(int arr[])
{
 printf("%d\n", sizeof(arr));//(2)
}
void test2(char ch[])
{
 printf("%d\n", sizeof(ch));//(4)
}
int main()
{
 int arr[10] = {0};
 char ch[10] = {0};
 printf("%d\n", sizeof(arr));//(1)
 printf("%d\n", sizeof(ch));//(3)
 test1(arr);
 test2(ch);
 return 0;
}
问:
(1)、(2)两个地方分别输出多少?
(3)、(4)两个地方分别输出多少?


结果如下:


2d07e6c0a24059cb0fb273ca0eb9a63e_f8be246627d84e80aa61a2597be44389.png


需要注意的是,指针大小为4字节仅仅是在32位的环境下,在64位大小为8。


//前置++和--
#include <stdio.h>
int main()
{
    int a = 10;
    int x = ++a;
7. 关系操作符
关系操作符
这些关系运算符比较简单,没什么可讲的,但是我们要注意一些运算符使用时候的陷阱。
警告:
在编程的过程中== 和=不小心写错,导致的错误。
8. 逻辑操作符
逻辑操作符有哪些:
区分逻辑与和按位与
区分逻辑或和按位或
逻辑与和或的特点:
    //先对a进行自增,然后对使用a,也就是表达式的值是a自增之后的值。x为11。
    int y = --a;
    //先对a进行自减,然后对使用a,也就是表达式的值是a自减之后的值。y为10;
    return 0;
}
//后置++和--
#include <stdio.h>
int main()
{
    int a = 10;
    int x = a++;
    //先对a先使用,再增加,这样x的值是10;之后a变成11;
    int y = a--;
    //先对a先使用,再自减,这样y的值是11;之后a变成10;
    return 0;
}



相关文章
|
5天前
|
C语言
条件操作符和逻辑操作符(C语言零基础教程)
条件操作符和逻辑操作符(C语言零基础教程)
|
5天前
|
存储 C语言
C learning_12 操作符前篇(算术操作符、移位操作符、位操作符、赋值操作符、单目操作符、关系操作符、逻辑操作符)
C learning_12 操作符前篇(算术操作符、移位操作符、位操作符、赋值操作符、单目操作符、关系操作符、逻辑操作符)
|
5天前
|
编译器 C++ 索引
C learning_13 操作符前篇(条件操作符、 逗号表达式、 下标引用、函数调用和结构成员、 表达式求值)
C learning_13 操作符前篇(条件操作符、 逗号表达式、 下标引用、函数调用和结构成员、 表达式求值)
|
7月前
|
索引
操作符之关系操作符,逻辑操作符,条件操作符,逗号表达式,下标引用操作符,函数调用操作符,访问结构体成员操作符
操作符之关系操作符,逻辑操作符,条件操作符,逗号表达式,下标引用操作符,函数调用操作符,访问结构体成员操作符
|
7月前
|
编译器 C语言
操作符的属性,C语言中运算符的优先性和结合性,常见的问题表达式
操作符的属性,C语言中运算符的优先性和结合性,常见的问题表达式
|
10月前
|
索引
操作符详解(全网最详细的操作符详解)下
操作符详解(全网最详细的操作符详解)
42 0
|
10月前
|
编译器 C语言
【C语言初阶】带你轻松玩转所有常用操作符(3)——关系操作符,逻辑操作符,条件操作符,逗号表达式
【C语言初阶】带你轻松玩转所有常用操作符(3)——关系操作符,逻辑操作符,条件操作符,逗号表达式
78 0
【C语言初阶】带你轻松玩转所有常用操作符(3)——关系操作符,逻辑操作符,条件操作符,逗号表达式
|
11月前
|
C语言
C语言——操作符(中)单目操作符、关系、逻辑、条件操作符
C语言——操作符(中)单目操作符、关系、逻辑、条件操作符