C语言运算符和表达式

**

运算符和表达式

**
所谓表达式就是指由运算符、运算量和标点符号组成的有效序列,其目的是说明一个计算过程。表达式可以独立成语句:
表达式;
运算符按功能分为:算术运算、赋值运算、关系运算、逻辑运算、位运算以及其他运算符

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 优先级
记忆口诀: 单算移关与 异或逻条赋
从右向左单条赋
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值