欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C语言操作符

程序员文章站 2022-07-14 08:10:08
...

1.操作符:指令系统的每一条指令都有一个操作符,它表示该指令应进行什么性质的操作。不同的指令用操作符这个字段的不同编码来表示,每一种编码代表一种指令。

2.C语言操作符的分类:

 1. 算数操作数 
 2. 移位操作符 
 3. 位操作 
 4. 赋值操作符
 5.  单目操作符
 6. 关系操作符 
 7. 逻辑操作符 
 8. 条件操作符
 9.  逗号表达式
 10. 下标引用,函数调用和结构成员这里插入代码片

算术操作符(不要移动负数位):

算术操作符有:+  -  *  /   %

注意:

  *.除了‘%’操作符之外,其他的几个操作符可以作用于整数和浮点数。
  *.对于‘/’操作符如果执行两个操作都为整数,执行整数除法。而浮点数执行的就是浮点数除法。
  *.‘%’操作符的两个操作符必须为整数,返回的是整除之后的余数。

移位操作符:

(1).移位操作符:位移位运算符是将数据看成二进制数,对其进行向左或向右移动若干位的运算。位移位运算符分为左移和右移两种,均为双目运算符。第一运算对象是移位对象,第二个运算对象是所移的二进制位数。

(2).移位操作符分类:

 左移操作符(把一个数的所有位都向左移动若干位):<<
 右移操作符(把一个数的所有位都向右移动若干位):>>

(3).移位规则:

*.  左移规则:左边抛弃,右边补0。
 int num=10;
                 "00000000000000000000000000001010" //在内存中的二进制
       丢掉<-(0)"00000000000000000000000000010100" //左移结果
   注意:左移先将数据存在CPU中,例如int类型空间有32个比特位,高位移出,低位补0;

            一个数在自身没有赋值的情况下,自身的值不会变。

*.右移规则:逻辑移位(左边用0填充,右边丢弃),算术移位(左边用该值的符号填充,右边丢弃)

  int num=-1;
 在内存中储存的补码为32个全一;
算术右移:左边用符号位填充
‘11111111111111111111111111111111’(1)->丢弃     因为num是负数所以左边补1逻辑 
逻辑右移:左边补0
‘01111111111111111111111111111111’(1)->丢弃   

总结:左移是逻辑/算术左移(两者完全相同),右移是算术右移,会保持符号位不变.

位操作符:

1,位操作符有:&(按位与),|(按位或),^(按位异或)

2.位操作符的操作数必须为整数。

  1. (1)按位与运算:

       按位  “与”  运算符     &   的作用是对运算符两侧以二进制表达的操作数按位分别进行  “与”  运算,而这一运算是以   数中相同的位  (bit)  为单位的。操作的规则是:仅当两个操作数都为  1  时,输出的结果才为  1  ,否则为  0     。   
    

如:


int a=1;
int b=2;
int main(){
     a&b;
}
结果为0
     1:00000……001
&    2:00000……010
    ---------------
     0:00000……000

(2)按位或运算:

        按位  “或”     运算符     |   的作用是对运算符两侧以二进制表达的操作数按位分别进行  “或”  运算,而这一运算是以数中相同的位  (bit)  为单位的。操作的规则是:仅当两个操作数都为  0  时,输出的结果才为  0  ,否则为  1  。

如:

int a=1;
int b=2;
int main(){
     a&b;
}
结果为0
     1:00000……001
|    2:00000……010
    ---------------
     3:00000……011

(3)按位异或运算:

   按位  “异或”  运算符     ^   的作用是对运算符两侧以二进制表达的操作数按位分别进行  “异  或”运算,而这一运算是以数中相同的位  (bit)  为单位的。异或运算操作的规则是:仅当两个  操作数不同时,相应的输出结果才为  1  ,否则为  0  。

 运算规则:相同比特位异或就会清零,任何数和零异或等于它本身;

如:

在int a=1;
int b=2;
int main(){
     a&b;
}
结果为0
     1:00000……001
^    2:00000……010
    ---------------
     3:00000……011这里插入代码片

异或运算例题:不创建临时变量,实现两个数的交换。

int main(){
     int a=10;
     int b=20;
     a=a^b;
     b=a^b;
     a=a^b;
}

赋值操作符:

1.赋值操作符‘=’,由“=”链接的表达式为赋值表达式。

2.如果赋值运算符两边的数据类型不相同,系统将自动进行类型转换,即把赋值号右边的类型换成左边的类型。

3.在赋值符“=”之前加上其它二目运算符可构成复合赋值符。如+=、-=、*=、/=、%=、<<=、>>=、&=、^=、|=。

如:


int a=2;
a=a+2; ->可以简写成:a+=2   

单目操作符:

1.单目运算符是指运算所需变量为一个的运算符,又叫一元运算符。

2.单目运算符分类:逻辑非运算符【!】、按位取反运算符【~】、自增自减运算符【++, --】、负号运算符【-】、类型转换运算符【(类型)】(只改变类型不改变值)、指针运算符和取地址运算符【*和&】、长度运算符【sizeof】()

  1. 自增和自减【++,–】

(1)前置++和–:先进行自增或自减,然后在在进行操作。

如:

int main(){
    int a=2;
    int x=++a; //先自增,然后在赋值。x为3
    int x=--a; //先自减,然后在赋值。x为1
}

(2)后置++和–:先对数值进行赋值等操作,然后在自增或自减。

      原理:先创建一个临时变量存放原来的值,然后原值在进行++或--。赋值的时候讲临时变量进行赋值。

如:

int main(){
    int a=2;
    int x=++a; //先赋值,然后在自增。x为2,a的值为3
    int x=--a; //先赋值,然后在自减。x为3,a的值为2
}

关系操作符:

  1. 关系操作符有:(<) 小于 , (<= )小于等于 , (>) 大于 ,(>= )大于等于 , (==) 相等 , (!=) 不等。

2.在六个关系运算符中,<、<=、>、>=的优先级相同,高于==和!=,==和!=的优先级相同。

3.关系运算符的运算结果只有 0 或 1。当条件成立时结果为 1,条件不成立结果为 0。

逻辑操作符:

1.分类:(&&)逻辑与,(||) 逻辑或 。

2.逻辑操作符将其操作数视为条件表达式:首先对操作数求值;若结果为0,则条件为假(false),否则为真(true).仅当逻辑与(&&)操作符的两个操作数都为true,其结果才得true.对于逻辑或(||)操作符,只要两个操作符之一为true,它的值就为true.

3.逻辑与:也是只有两个操作数都是true,结果才是true。但是如果左边操作数为false,就不计算右边的表达式,直接得出 false。

逻辑或:如果一个操作数或多个操作数为 true,则逻辑或运算符返回布尔值 true;只有全部操作数为false,结果才是 false。

例题:


int main(){
     int i=0,a=0,b=2,c=3,d=3;
     (1) i=a++&&++b&&d++;    //i=a++条件为假,后面程序不执行
     (2) i=a++&&++b&&d++;    //i=a++条件为假,++b条件为真,后面代码不执行
ptintf("a=%d\nb=%d\nc=%d\nd=%d\n",a,b,c,d);
}
运行结果:(1)abcd:1234

                  (2)abcd:1334

条件操作符:

1.(条件表达式)?(条件为真时的表达式):(条件为假时的表达式)。

2.含有条件操作符的表达称为条件表达式。


if(a>4)
   b=3;
else b=1;
换成条件表达式为:
int z=a>4?3:1;

逗号表达式:

1.逗号表达式是一种特殊的运算符,它可以将两个表达式连接起来,逗号表达式的一般形式是:exp1,exp2,……expn。

2.求解顺序是:先求解表达式1,再求解表达式2,依次类推.整个逗号表达式的值是最后一个表达式的值。

3.例题::(a = 3,b = 5,b+ = a,c = b* 5) 逗号表达式的值为40.

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

1.下标引用:[]

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

如:

int arr[10];
arr[9]=10;  //实用下标引用操作符
[]的两个操作数是arr和9.

2.函数调用操作符:()。

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

例:

void test1(){
    printf("hello\n");
}
void test2(const char*str){
    printf("%s\n",str);
}
int main(){
    tset();       //实用()作为函数调用操作符
    test2("holle"); //实用()作为函数调用操作符
}```

3.访问一个结构体的成员:结构体。成员

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

例:

struct Stu  

{
char name[10];
int age;
char sex[5];
double score;
};

void set_age1(struct Stu stu)
{
stu.age = 10;
}
void set_age2(struct Stu* pStu)
{
pStu->age = 18;//结构成员访问
}
int main()
{
struct Stu stu;
struct Stu* pStu = &stu;//结构成员访问
stu.age = 20;//结构成员访问
set_age1(stu);

pStu->age = 20;//结构成员访问  
set_age2(pStu);  
return 0;  

}


操作符的优先级和结合性:

1.优先级:就是当有多个运算符在同一个表达式中出现时,先执行哪个运算符。

2.结合性:就是当一个运算符多次出现时,先执行哪个运算符。

3.在同一表达式中,先执行优先级高的运算符,然后再执行优先级低的运算符;优先级相同的按结合性从左向右或从右向左的顺序执行。

下面为操作符优先级表:
![在这里插入图片描述](https://img-blog.csdnimg.cn/2019033121303383.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDE0MTg4MQ==,size_16,color_FFFFFF,t_70)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190331212910504.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDE0MTg4MQ==,size_16,color_FFFFFF,t_70)