当前位置:首页 » 《随便一记》 » 正文

C语言初阶七:C语言操作符详解(1)

12 人参与  2024年10月28日 08:41  分类 : 《随便一记》  评论

点击全文阅读


#1024程序员节|征文#

这篇文章是对之前文章中操作符的补充,可以看之前的文章:C语言初阶:六.算数操作_如何用编程表示除法-CSDN博客

  C语言操作符是用于执行各种运算和操作的符号。包括算术操作符(如+、-、*、/、%),用于基本数学运算;关系操作符(如==、!=、>、<、>=、<=),用于比较两个值;逻辑操作符(如&&、||、!),用于布尔逻辑运算;位操作符(如&、|、^、~、<<、>>),用于直接操作二进制位;还有赋值操作符(如=、+=、-=等),用于给变量赋值。这些操作符是C语言编程的基础。

1. 操作符分类

算术操作符        移位操作符

位操作符         赋值操作符

单目操作符         关系操作符

逻辑操作符         条件操作符

逗号表达式         下标引用、函数调用和结构成员

2. 算术操作符

+    -   *   /   %

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

3. 移位操作符

左移操作符 <<

右移操作符 >> 

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

//2进制
//整数的2进制表示方式有三种
//        原码,补码,反码
//在内存中,存储的是补码的二进制
//所以在参与移位的时候,移动后都是补码

3.1 左移操作符

移位规则: 左边抛弃、右边补0'

int main(){int a = 10;int b = a << 1;//00000000000000000000000000001010 - a的补码进行左移printf("%d\n", a);printf("%d\n", b);return 0;}

3.2 右移操作符

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

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

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

int main(){int a = -1;//100000000000000000000000000000001  --原码//111111111111111111111111111111110  --反码//111111111111111111111111111111111  --补码//int b = a >> 1;printf("a=%d\n", a);printf("b=%d\n", b);//算数右移return 0;}

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

例如:

int num = 10;

num>>-1;//error

4. 位操作符

位操作符有:

&  //按位与

|   //按位或

^  //按位异或

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

int main(){int a = 3;//00000000000000000000000000000011int b = -5;//10000000000000000000000000000101//11111111111111111111111111111010//11111111111111111111111111111011  --补码int c = a & b;//00000000000000000000000000000011//11111111111111111111111111111011//00000000000000000000000000000011---> 3,打印3//按位与规则:有0则为0,全为1,则为1printf("c=%d\n", c);//c=3return 0;}
  |   按位或按位或规则:有1则为1,全为0,则为0int main(){int a = 3;//00000000000000000000000000000011int b = -5;//10000000000000000000000000000101//11111111111111111111111111111010//11111111111111111111111111111011  --补码int c = a | b;//00000000000000000000000000000011//11111111111111111111111111111011//11111111111111111111111111111011----> -5//按位或规则:有1则为1,全为0,则为0printf("c=%d\n", c);//c=-5return 0;}
  ^  按位异或   1.可读性差,2.效率不如使用临时变量的方法  3.异或只能交换整数(局限)按位或规则:相同为0,相异为1a^a=00^a=a异或支持交换律 int main(){int a = 3;//00000000000000000000000000000011int b = -5;//10000000000000000000000000000101//11111111111111111111111111111010//11111111111111111111111111111011  --补码int c = a ^ b;//00000000000000000000000000000011//11111111111111111111111111111011//11111111111111111111111111111000--->c的补码// 1000000000000000000000000000111// 1000000000000000000000000001000--->原码  c=-8//按位或规则:相同为0,相异为1printf("c=%d\n", c);//c=-8return 0;}

5. 赋值操作符

赋值操作符是一个很棒的操作符,他可以让你得到一个你之前不满意的值。也就是你可以给自己重新赋值。

int weight = 120;//体重

weight = 89;//不满意就赋值

double salary = 10000.0;

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

赋值操作符可以连续使用,比如:

int a = 10;

int x = 0;

int y = 20;

a = x = y+1;//连续赋值 这样的代码感觉怎么样?

那同样的语义,你看看:

x = y+1;

a = x; 这样的写法是不是更加清晰爽朗而且易于调试

复合赋值符 +=    -=    *=   /=   %=   >>=

这些运算符都可以写成复合的效果。 比如:

int x = 10;

x = x+10;

x += 10;//复合赋值

//其他运算符一样的道理。这样写更加简洁

6. 单目操作符

6.1 单目操作符介绍

!           逻辑反操作

-           负值

+           正值

&           取地址

sizeof      操作数的类型长度(以字节为单位)

~           对一个数的二进制按位取反 --          

前置、后置-- ++        

前置、后置++ *          

*      间接访问操作符(解引用操作符)

(类型)       强制类型转换

演示代码:

#include <stdio.h>int main(){ int a = -10; int *p = NULL; printf("%d\n", !2); printf("%d\n", !0); a = -a; p = &a; printf("%d\n", sizeof(a)); printf("%d\n", sizeof(int)); printf("%d\n", sizeof a);//这样写行不行? printf("%d\n", sizeof int);//这样写行不行? return 0;}

6.2 sizeof 和 数组

关于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;}

7. 关系操作符

>

>=

<  

<=

!=       用于测试“不相等”

==      用于测试“相等”

这些关系运算符比较简单,没什么可讲的,但是我们要注意一些运算符使用时候的陷阱。

警告: 在编程的过程中== 和=不小心写错,导致的错误。


点击全文阅读


本文链接:http://zhangshiyu.com/post/178808.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1