C语言运算符

1、运算符

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

关系运算符:> >= <

逻辑运算符:&& || !

位运算符:& | ~ ^ >

赋值运算符:=

复合赋值运算符:+= -= *= /= %= &= |= ^= >=

内存和地址:[] . -> & *

其他:

三目运算符:条件运算符:? :

sizeof() return () ,

1.1、算术运算符

运算符

功能

举例

+

加法

a+b

-

减法

a-b

*

乘法

a*b

/

除法

a/b

%

求余(取模)

a%b

++

自增

a++,++a

--

自减

a--,--a

关注点:

1.减号也是负号,-a,用来取变量的相反数

2.求余(取模)运算符要求,左右两边的操作数必须是整型数据(0除外),字符型数据也可以,因为字符型数据操作的是它本身的ASCII码值。

3.自增和自减运算,不经可以对整型操作,也可以对浮点型,指针,字符型进行操作。

4.+ - * / %都是双目运算符,++ --是单目运算符,+ - 在当做取正和取负的时候是单目运算符。

前缀自增自减运算:先进行自增自减,在参与运算 ++a --a

后缀自增自减运算:先参与运算,在进行自增自减 a++ a--

做自增自减运算的时候,只要有自增和自减,那么这个值在参与运算之后,一定会加一次

表达式: int a = 10; //12 11 int b = ++a + a++; printf("b = %d\n", b);//23 从左往右计算,有多个自增自减同时运算的时候,后缀的自增自减会在当前位置直接用作输出 前缀自增自减会等所有的自增自减运算做完了之后在做输出。

Ubuntu里面,编译器在编译printf函数的时候,按照从右往左的顺序进行编译,有多个自增自减同时运算的时候,后缀的自增自减会在当前位置直接用作输出,在进行自增自减的过程中,前缀自增自减会等所有的自增自减运算做完了之后在做输出。

int a = 10; //当有多个自增自减的时候,++a会在最后计算完所有的自增自减之后在参与 printf("%d %d %d %d\n", a++, ++a, ++a, a++); // 13 14 14 10 // 13 14 14 10

1.2、关系运算符

运算符

功能说明

举例

>

大于

a>b

>=

大于等于

a>=5

小于

a

小于等于

a

==

等于

a==b

!=

不等于

a!=b

关注点:

1、关系运算符用于判断运算符两边的表达式是否满足给定的条件

2、关系运算符组成的表达式,称为关系表达式,其值为布尔类型,要么为真,要么为假

3、判断是否等于是双等号,而不是一个等号,一个等号代表的是赋值运算

当在写判断一个变量是狗等于另一个值得时候,最好把判断的这个常量放在比较的变量前面。

#include <stdio.h> int main(int argc, char const *argv[]) { int n; while(1) { scanf("%d", &n); if(10 == n)//需要注意不要写成 n = 10 { printf("恭喜你,猜对了\n"); break; } else if (n < 10) { printf("太小了,请从新输入\n"); } else if (n > 10) { printf("太大了,请从新输入\n"); } } return 0; }

在C语言中,规定,非0为真,0为假

练习:

1.3、逻辑运算符

运算符

功能说明

举例

&&

逻辑与

x>0&&y>0

||

逻辑或

x>0||y

!

逻辑非(逻辑反)

!(x==1)

1.3.1、运算规则

1、逻辑反:将逻辑真假翻转,真变假,假变真

2、逻辑与:将两个关系表达式串联起来,当左右两边的表达式都为真的时候,结果就为真。

3、逻辑或:将两个关系表达式串联起来,当左右两边任意一个表达式为真的时候,结果就为真。

0

1.3.2、特殊规则

1、在做逻辑与的时候,如果左边的表达式的结果为假,那么右边的表达式就不在执行了,相反,左边为真,右边要继续执行

2、在做逻辑或的时候,如果左边的表达式的结果为真,那么右边的表达式就不在执行了,相反,左边为假,右边要继续执行

3、

int a = 10; 
int b = 20; 
if(++a>10&&b++>19); 计算:a b 的值 a=11,b=21 a = 10; b = 20; i
f(a++>10&&++b>19); 计算:a b 的值 a=11,b=20 a = 10; b = 20; 
if(a--<10||--b>19); 计算:a b 的值 a=9,b=19 a = 10; b = 20; 
if(--a<10||b-->19); 计算:a b 的值 a=9,b=20

i

1.4、位运算符 *

运算符

名称

功能说明

举例

~

违反

将变量a的每一位取反

~a

&

位与

将变量a与变量b进行位与操作

a&b

|

位或

将变量a与变量b进行位或操作

a|b

^

位异或

将变量a与变量b进行位异或操作

a^b

位左移

将变量a中的每一位进行左移

a

>>

位右移

将变量a中的每一位进行右移

a>>4

进行位操作的时候,不管是操作十进制,八进制,十六进制,我们需要将操作的数字,转换成二进制之后,在进行位操作

正数:在计算机里面是直接按原码存储的,负数时按照补码存储的

原码:把这个数转成二进制

反码:原码取反

补码:反码+1

位反:

位与:

位或:

位异或:

位左移:

位右移

运算规则:总结

位逻辑与,或,反,拥有与逻辑运算符相似的规则和一样的真值表

位逻辑异或运算:相同为0,不同为1。(一个位跟某一位进行异或,与1异或,取反,与0异或,不变)

移位运算:左移时空出来的位置补0操作,左移的时候,移出去的数据不会丢弃,但是当超出数据本身的范围,就会将超出的数据丢弃。右移时空出来的位置,可以补0,可以不补,没有任何影响,右移出去的数据,就丢弃。(例外情况:如果做移位运算的操作数是一个有符号位的数(负号),在做右移的时候,移出去的不要,空出来的位补上原符号位)。

判断:

1.5、赋值运算符

1.5.1、简单赋值运算符=

1.不能对常量赋值,只能对变量赋值

2.不能对定义好的数组赋值,可以 对数组的某一个元素进行赋值

int a[3]; //a[3] = {1, 2, 3};//错误的 a[0] = 1; a[1] = 2; a[2] = 3; for (int i = 0; i < 3; ++i) { scanf("%d", &a[i]); }

3.可以连续进行赋值,顺序从右往左

int a, b, c; a = b = c = 0;

1.5.2、复合赋值运算(复杂)

当左右两边有相同操作数时,可以采用复合赋值运算符,不仅直观,且提高运行效率

除了C语言里面规定的复合赋值运算符之外,生造别的复合赋值运算符是非法的。

//加减乘除取余 a=a+10;//等价于a+=10; a=a-10;//等价于a-=10; a=a*10;//等价于a*=10; a=a/10;//等价于a/=10; a=a%10;//等价于a%=10; //位运算 a=a&10;//等价于a&=10; a=a|10;//等价于a|=10; a=a^10;//等价于a^=10; a=a<<10;//等价于a<<=10; a=a>>10;//等价于a>>=10; //a=a~10;//错的,~是单目运算符

1.6、内存存取运算符

[]:下标 arr[3] 得到数组arr下标为3的这一个元素

.:取成员 stu.name 得到结构体变量stu的成员那么的值

->:取成员 stu->name 得到结构体指针变量stu的成员那么的值

&:取地址 &a 得到变量a的地址

*:解引用 *p 得到地址p里面的数据

1.7、特殊运算符

1.7.1、三目运算符

?:

唯一一个需要三个操作数的运算符

语法:表达式1?表达式2:表达式3

释义:当表达式1成立,为真,执行表达式2,不成立,为假,执行表达式3

int a = 10; int b = 20; int c = a>b?a:b; printf("c = %d\n", c);

1.7.2、sizeof()运算符

含义:计算指定的数据类型的大小或者变量所占用的内存的字节个数

语法:sizeof(变量)、sizeof(数组)、sizeof(数据类型),计算变量,数组,数据类型所占用的字节数,计算变量时,sizeof后面的括号是可以省略的,但是,变量名和sizeof中间还是要用空格隔开。

int n = 10; printf("sizeof n = %ld\n", sizeof n); printf("sizeof(int) = %ld\n", sizeof(int));

1.7.3、return运算符

含义:退出某个函数(如果退出的函数是main函数,那么整个程序也就退出了)

语法:必须出现在函数体内,在退出的时候,可以带出函数对应的返回值类型的数据

1.7.4、()函数调用

调用函数的时候,在函数名的后面加上的括号,必加。

函数名([实际参数])

1.7.5、,逗号运算符

从左往右依次顺序进行运算,取整个表达式运算结果的最后一个表达式的值,为逗号表达式的值

int a = 100; 
int b = 200; 
int c; 
c = (a+=10, b+=20, a++, a+100, b+a); //从左往右,中间只要在给变量赋值,那么最后采用的是更改之后的变量的值 
printf("a = %d\n", a); 
printf("b = %d\n", b); 
printf("c = %d\n", c);

2、优先级和结合性

当表达式中出现不同的运算符时,根据优先级来决定谁先执行,谁后执行,比如有加减乘除的时候,先乘车,后加减,有括号,先算括号里面的

当表达式中出现多个相同优先级的运算符时,根据运算符的结合性来决定谁先执行,谁后执行,比如加减运算的时候,从左往右运算

  • 28
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值