1.3运算符
1.3.1运算符
用算术运算符将运算对象(也称操作数)连接起来的、符合C语法规则的式子,称为C算术表达式
运算对象包括常量、变量、函数等
例如: a*b/c-1.5 + 'a'
1.3.2运算符的分类:
1、双目运算符:即参加运算的操作数有两个
例: +
a+b
2、单目运算符:参加运算的操作数只有一个.
++自增运算符给变量值+1
-自减运算符
a++;
3、三目运算符:即参加运算的操作数有3个
0?0:0
1.3.3算数运算符
+-*/%
+=
-=
*=
/=
%=
10%3表达式的结果为 1|
复合运算符:
a+= 3
相当于a=a+3
a*=6+8相当于 a=a*(6+8)
1.3.4关系运算符
(>、<、==、>=、<=、!=)
!=为不等于
一般用于判断条件是否满足或者循环语句
1.3.5逻辑运算符
1、&&逻辑与
两个条件都为真,则结果为真
if((a>b) && (a<c))
if(b<a<c)//这种表达方式是错误的
2、II 逻辑或
两个条件至少有一个为真,则结果为真
if(a>b) II (a<c))
3、!逻辑非
if(!(a>b))
{
}
1.3.6位运算符
十进制转二进制:
方法除2求余法
例:
123十进制转二进制
正数在内存中以原码形式存放,负数在内存中以补码形式存放
正数的原码=反码=补码
原码:将一个整数,转换成二进制,就是其原码。
如单字节的5的原码为: 0000 0101; -5 的原码为1000 0101。
反码:正数的反码就是其原码;负数的反码是将原码中,除符号位以外,每一位取反。
如单字节的5的反码为: 0000 0101; -5 的反码为1111 1010。
补码:正数的补码就是其原码:负数的反码+1就是补码。
如单字节的5的补码为:
00000101; -5 的原码为1111 1011。
在计算机中,正数是直接用原码表示的,如单字节5,在计算机中就表示为: 0000 0101.
负数用补码表示,如单字节-5,在计算机中表示为1111 1011。
无论是正数还是负数,编译系统都是按照内存中存储的内容进行位运算。
![](https://i-blog.csdnimg.cn/blog_migrate/df3d4eeda72371e4e255c0fcaf4bcc36.png)
![](https://i-blog.csdnimg.cn/blog_migrate/701e90bc33519c9d8eec7b9025d833ce.png)
![](https://i-blog.csdnimg.cn/blog_migrate/580558005cae2293056088b96f12a83c.png)
![](https://i-blog.csdnimg.cn/blog_migrate/77ae87bef42da83795cb14da4f72684d.png)
总结 右移:
1、逻辑右移.
高位补0,低位溢出
注:无论是有符号数还是无符号数都是高位补0,低位溢出
2、算数右移
高位补符号位,低位溢出(有 符号数)
注:对无符号数来说,高位补0,低位溢出
对有符号数来说,高位补符号位,低位溢出
在一个编译系统中到底是逻辑右移动,还是算数右移,取决于编译器
判断右移是逻辑右移还是算数右移
#include < stdio.h>
int main(int argc, char *argv[])
{
printf("%d\n",-1>>3);
return 0;
如果结果还是-1证明是算数右移
(2) 左移<<高位溢出,低位补0
5 <<1
0000 0101
0000 1010
1.3.7条件运算符号
0?0:()
A?B:C;
如果?前边的表达式成立,整个表达式的值,是?和:之间的表达式的结果
否则是:之后的表达式的结果
例14:
#include < stdio.h>
int main(int argg, char *argv[])
{
int a;
a=(3<5)?(8);:(9);
printf("a=%d\n",a);
return 0;
}
1.3.8逗号预算符
(),()
例15:
#include < stdio.h>
int main(int argc, char *argv[])
{
int num;
num=(5,6);
printf("%d\n",num);
return 0;
}
注意逗号运算符的结果是,后边表达式的结果
1.3.9自增自减运算符
i++
i--
运算符在变量的后面,在当前表达式中先用i的值,下条语句的时候i的值改变
例16:
#include <stdio.h>
int main()
{
int i=3;
int num;
num=i+ +;
printf("num= %d,i= %d\n",num,i);//num=3 ,i=4
return 0;
}
++i先加,后用
例17:
#include < stdio.h>
int main()
{
int i=3;
int num;
num=++i;
printf("num= %d,i=%d\n",num,i);//num=4,i=4
return 0;
}
例18 :
#include <stdio.h>
int main(int argc, char *argv[])
{
int i=3;
int num;
num= (i++)+(i++)+(i++);
printf("nufm= %d\n",num);
return 0;
}
例19 :
#include < stdio.h>
int main(int argc, char *argv[)
{
int i=3;
int num;
num= (+ +i)+(++i)+(+ +i);
printf("num=%d\n" ,num);
return 0;
}
1.3.10运算符优先级及结合性
运算符优先级
在表达式中按照优先级先后进行运算,优先级高的先于优先级低的先运算
优先级--样的按结合性来运算
int a;
a=2+5+3*4-6
运算符结合性
左结合性:从左向右运算
int a;
a=2+3+9+10;
右结合性:从右向左运算
int a,b,c,d;
a=b=c=d=100;
![](https://i-blog.csdnimg.cn/blog_migrate/107d9da2cb0b59ce7c801da0ce2dafc4.png)
![](https://i-blog.csdnimg.cn/blog_migrate/4845911a10e54334f2629d8e83f0c039.png)
注:建议当表达式比较复杂的时候,用()括起来,括号的优先级最高,优先算括号里的。
这样也防止写错表达式。
int a;
a= ( 2+3 ) *6+(9*3)+10;