**
运算符和表达式
** 所谓表达式就是指由运算符、运算量和标点符号组成的有效序列,其目的是说明一个计算过程。表达式可以独立成语句: 表达式; 运算符按功能分为:算术运算、赋值运算、关系运算、逻辑运算、位运算以及其他运算符
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 优先级
记忆口诀: 单算移关与 异或逻条赋
从右向左单条赋