**
运算符和表达式
**
所谓表达式就是指由运算符、运算量和标点符号组成的有效序列,其目的是说明一个计算过程。表达式可以独立成语句:
表达式;
运算符按功能分为:算术运算、赋值运算、关系运算、逻辑运算、位运算以及其他运算符
1.算术运算符:+ - * / % ++ –
(1)/:整数相除,向下取整。只针对于常量相除,不针对于变量相除。
int a=3/2;
float b=3/2;
float c=3.0/2;
float n1=3,n2=2;
printf(“%d\n”,a);//1
printf(“%f\n”,b);//1.000000
printf(“%f\n”,c);//1.50000
printf(“%f\n”,n1/n2);//1.50000
(2)%:只能用于整数运算,取余
10%3=1
12%10=2
123%10=3
例子:将12345的个十百千万位分别输出到终端。
#include <stdio.h>
int main(int argc, char const *argv[])
{
int n=12345,g=0,s=0,b=0,q=0,w=0;
g=n%10;
s=n/10%10;
b=n/100%10;
q=n/1000%10;
w=n/10000;
printf("%d %d %d %d %d \n",w,q,b,s,g);
return 0;
}
(3)++:自增
int a=0;
a++;或者++a;相当于a=a+1;
int a=1,b=1;
a++;//a=a+1
++b;//b=b+1
printf(“%d %d\n”,a,b);//2 2
(4)–:自减
a–;
–a;
a=a-1;
#include <stdio.h>
int main(int argc, char const *argv[])
{
int a=1,b=1;
a--;//a=a-1
--b;//b=b-1
printf("%d %d\n",a,b);//0 0
return 0;
}
自加自减和打印结合:++在前先++再打印,++在后先打印在++。
#include <stdio.h>
int main(int argc, char const *argv[])
{
int a=1,b=1;
printf("%d\n",a++); //打印1 相当于:printf("%d\n",a);a++;
printf("%d\n",a); //打印2
printf("%d\n",++b);//打印2 相当于:b++;printf("%d\n",b);
return 0;
}
2.赋值运算:= += -+ *= /= %=
int a=1,b=0;
(1)b=a++;//先赋值,再自加
先当于:b=a;a++;
(2)b=++a;//先自加,再赋值。
相当于:a++;b=a;
int a=1,b=0;
//b=++a;//结果会得2
b=a++;
printf(“%d”,b);//结果得1
例子:
z=++x+y++;
相当于:
x=x+1;
z=x+y;
y=y+1;
(3)a+=2;
相当于:a=a+2;
例子1:
#include <stdio.h>
int main(int argc, char *argv[])
{
int a = 10;
int b = a++; //b=10 a=11
int c = a + b;//c=21
int d = (b++) +c;// d=10+21
printf("d =%d \n",d); //d=31
return 0;
}
例子2:
#include <stdio.h>
int main(int argc, char *argv[])
{
int a = 10;
int b = ++a; //b=11 a=11
int c = a + (b++); //a=11 b=12 c=22
int d = b + c; //d=12+22=34
printf("%d\n", d); //d=34
return 0;
}
3. 关系运算:> >= < <= == !=
用来判断两者得关系,返回真或者假。
例子:
#include <stdio.h>
int main()
{
int a=2,b=3;
printf("%d\n",a>b);
printf("%d\n",100%10!=0);
return 0;
}
4.逻辑运算符:&& || !
4.1 &&(逻辑与)
全真则真,一假则假。
全都是真的才是真,只要有假就是假。
4.2 ||(逻辑或)
一真则真,全假则假。
只要有真就是真,全都是假才是假。
4.3 !(逻辑非)
非真为假,非假为真。
例子:
#include <stdio.h>
int main()
{
int a=2,b=3;
printf("%d\n",a>b); //0
printf("%d\n",100%10!=0); //0
printf("%d\n",(b>0)&&(b<6));//1
printf("%d\n",(a<0)||(a>3));//0
printf("%d\n",!(a>b));//1
return 0;
}
4.4 截断法则
逻辑或||运算中:如果前面表达式为真,则后面的表达式不执行。
逻辑与&&运算中:如果前面表达式为假,则后面的表达式不执行。
例子1:
#include <stdio.h>
int main()
{
int a=5,b=6,c=7,d=8,m=2,n=2;
int r=(m=a<b)||(n=c>d);
printf("%d %d %d",m,n,r);//1 2 1
}
例子2:
#include <stdio.h>
int main()
{
int a=5,b=6,c=7,d=8,m=2,n=2;
int r=(m=a>b)&&(n=c>d);
printf("%d %d %d",m,n,r);//0 2 0
}
5 位运算符:& | ~ ^ << >>
负数都是用反码进行运算的。
5.1 位与 &
全1则1,有0则0.
例如:
a:1111 0101
b:1010 1111
a&b: 1010 0101
5.2 位或 |
有1则1,全0为0。
例如:
a:1111 0101
b: 0101 0011
a|b: 1111 0111
5.3 异或^
不同为1,相同为0。
例如:
a: 1111 0101
b: 1111 1101
a^b: 0000 1000
5.4 取反 ~
按位取反,0变成1,1变成0。
例子:
(1)~15
正数15:0000 1111
~15:11110000
(2)~-1:
原码: 1000 0001
反码: 1111 1110
补码=反码+1:1111 1111
~(-1):0000 0000
(3)~ -5:
原码:1000 0101
反码:1111 1010
补码:1111 1011
~(-5):0000 0100
5.5 << 左移
左移几位,右边补几个零。
例子:
(1)8<<2: 1000<<2==>100000
(2) -5<<3:
-5求补码
原码:1000 0101
反码:1111 1010
补码:1111 1011
<<3: 1101 1000
左移3位结束后,反求其原码
1101 0111
1010 1000 = -40
负数补码求原码:先减一,再符号位不变然后按位取反。
5.6 >> 右移
右移几位,左边补几个符号位,正数补0负数补1。
例子:
8>>2 :
0000 1000>>2 :0000 0010=2
5.7 置一公式和置零公式
置一公式:a|(1<<n)
置零公式:a&(~(1<<n))
例子:
#include <stdio.h>
int main()
{
int a=0b0111;
printf("%d\n",a|(1<<3));
printf("%d\n",a&(~(1<<2)));
return 0;
}
6 特殊运算符
6.1 三目运算符
(条件判断运算符)表达式:表达式1?表达式2:表达式3
先求解表达式1,若其值为真则执行表达式2,表达式2的返回值作为整体的取值。否则将表达式3的值作为整体的取值。
#include <stdio.h>
int main()
{
int a=10,b=6,max=0;
max=(a>b)?a:b; 条件判断运算符
printf("%d\n",max);
return 0;
}
判断以下打印结果
int num1 = 10, num2 = 20;
int res = num1 > num2 ? num1++ : num2++;
printf(“num1=%d num2=%d res=%d\n”, num1, num2, res);
结果:10 21 20
6.2 sizeof()
用来计算数据所占空间大小的运算符。
格式:sizeof(数据类型或者变量名);
#include <stdio.h>
int main()
{
int a = 10;
double d=1.5;
char c='a';
printf("%d\n", sizeof(int));//4
printf("%d\n", sizeof(a));//4
printf("%d\n", sizeof(d));//8
printf("%d\n", sizeof(c));//1
return 0;
}
8 优先级
记忆口诀: 单算移关与 异或逻条赋
从右向左单条赋