C语言(二)---算术运算符

来源:公众号【编程学习基地】
作者:梦凡

算术运算符

运算符 举例
+ 加 a+b
- 减 a-b
* 乘 a*b
/ 除 a/b
% 求余 a%b

加减和乘法运算符不必多说,我们来看看除法运算符和求余运算符

除法运算符
  • 两个实数相除的结果为双精度实数,两个整数相除的结果为整数(一般向0取整)

例如:5/3 运行结果为1,舍去了小数部分

根据整数除法特性:四舍五入 设计方法
  • 四舍五入到个位
#include<stdio.h>
int main()
{
    float n = 1.525f;                   //float n = 1.425f;
    printf("%d", (int)(n * 10 + 5)/10); //四舍五入到个位  输出为 2
    return 0;
}
  • 四舍五入到小数点后两位
#include<stdio.h>
int main()
{
    float n = 1.525f;
    printf("%f", (int)(n*100+0.5)/100.0);   //四舍五入到小数点后两位
    return 0;
}
  • 当然也有函数可以实现四舍五入

<stdio.h>里面有个 round() 函数 将浮点值舍入为最接近的整数。

#include<stdio.h>
#include<math.h>
int main()
{
    float n = 1.525f;
    printf("%f", round(n));      //输出为 2.000000
    return 0;
}
求余运算符

求余只能两个整数求余

利用求余得到整数的各个位数:水仙花数 算法
#include<stdio.h>
int main()
{
    int i,n,m,l;
    for(i=100;i<=999;i++)
    {
        n=i/100;    //百位数
        m=i%100/10; //十位数
        l=i%10;     //个位数
        if(i==n*n*n+m*m*m+l*l*l)    //判断水仙花数
        {
            printf("%d\t",i);
        }
    }
    printf("\n");
    return 0;
}

关系运算符和逻辑运算符

关系运算符

关系运算符和逻辑运算符主要用在分支和循环里面作为条件判断真假

  • 比较的结果有两种状态 1 和 0 真(1)和假(0)
关系运算符 举例
> 小于 1>2 为假,结果为0
< 大于 1<2 为真,结果为2
>= 大于等于 1>=2 为假,结果为0
<= 小于等于 1<=2 为真,结果为1
== 等于 1==2 为假,结果为0
!= 不等于 1!=2 为真,结果为1
  • 对于小数 浮点型数据不够精确 一般不用==
  • 0.009<x<0.011 这种数学表达式就禁用了,要用逻辑运算符来连接
逻辑运算符
&& 逻辑与
  • 左右两个条件都为真 最后的结果为真 否则(只要有一个为假) 结果为假
    if(0.009<x&&x<0.011){}  //这种就是正确的
|| 逻辑或
  • 左右两边的条件只要有一个为真 结果为真 两边都为假 结果为假
    if(x<0.009||x>0.011){}  
!逻辑非
  • 一般放在一个条件前面 真变假 假变真

关于用数字作为条件 0为假 非0为真

逻辑运算符的截断
  • 逻辑与 两边都为真 结果为真
  • 左边为假 直接得到整个式子的结果为假(右边可以不用算)
#include<stdio.h>
int main()
{
    int x=1;
    if(0&&(++x)){}
    printf("%d",x);     //结果为1  即++x这个代码未执行
    return 0;
}
  • 逻辑或 左边为真 右边可以不用算(截断)

位运算符(二进制运算符)

学C语言很少用到二进制,但是,我们需要了解他

  • 按位与 &
  • 对一个二进制数字操作:有0则0
14&89       14二进制:1110      89二进制:0101 1001
        0000 1110
        0101 1001
按位与   0000 1000
结果为:0000 1000(二进制),10(十进制)
  • 按位或 |
  • 对一个二进制数字操作:有1则1

按位异或 ^

  • 对一个二进制数字操作:相同为0不同为1

按位取反~

  • 对一个二进制数字操作:1变0 0变1
~14         14二进制:0000 1110
        0000 1110
按位取反 1111 0001

  • 左移 <<
  • x<<n 去掉前面的n位 后面补上n个0
14<<2       14二进制:0000 1110
            0000 1110
            0011 1000
左移补0  结果为0011 1000

  • 右移 >>
  • x>>n 去掉后面的n位 前面补上n个符号位(正数前面补0 负数前面补1)

对于一个正整数 右移一位相当于除以2

异或 ^

  • 特点:对于同一个数字异或两次会得到它本身
    14^87^87==14

  • 异或的用法
  • 简单的加密

z=x^y 对x进行加密

a=z^y 对z进行解密

交换两个变量的值
    //利用临时变量交换
    int temp;
    temp=x;
    x=y;
    y=temp;
    //利用异或
    x=x^y;
    y=x^y;
    x=x^y;
    //用加减法
    x=x+y;   //对于x和y比较大的时候  x+y可能超过int范围
    y=x-y;
    x=x-y;  

赋值运算符

把一个值赋值给一个变量: 左值 = 右值 把右值赋值给左值

    x=4;   //4这个值赋值给x这个变量

  • 左值 只能是变量
  • 右值 可以是数字 表达式(1+2)

条件运算符(三目运算符)

条件 ? 表达式1 : 表达式2

    //求两个数的最大值
    max=a>b?a:b;

其他运算符

() 括号运算符
  • 改变计算顺序(优先级)
  • 类型转换
    (float)3/4:

类型转换存在的问题:精度高的数据 转换成精度低的数据 可能会丢失数据

类型 char int float double 精度由低到高

    (int)(3.14+0.5)   小数强转整数  小数部分全部丢掉

++ --自增和自减
前++

先运算,再自增

    int  x,y;
    x=0;
    y=x++;   //先用x之前的值进行计算   然后 再给x变量加1
    //结果y=0,x=1

后++

先自增,再运算

    int  x,y;
    x=0;
    y=++x;   //先给x变量加1,再进行计算
    //结果y=1,x=1

前加加,后加加探讨(小白勿看)
#include<stdio.h>
int main()
{
    int i = 5, j = 5, p, q;
    p = (i++) + (i++) + (i++); 
    q = (++j) + (++j) + (++j); 
    printf("%d,%d,%d,%d", p, q, i, j);      
    return 0;
}

输出结果:15,22,8,8

  • 这个涉及到 前加加先运算,再自增;后加加先自增,再运算 这一特性
#include<stdio.h>
int main()
{
    int i = 8;
                                             //输出   i
    printf("%d\t", ++i);    //i先加一在输出       9     9

    printf("%d\t", --i);    //i先减一再输出       8     8

    printf("%d\t", i++);    //i输出再加一        8     9

    printf("%d\t", i--);    //i输出再减一        9     8

    printf("%d\t", -i++);   //i输出再加一        -8    9

    printf("%d\t", -i--);   //i输出再减一        -9    8

    printf("\n-----------------\n");

    i = 8;
    printf("%d\t%d\t%d\t%d\t%d\t%d\n", ++i, --i, i++, i--, -i++, -i--);//前加加完成后再后加加 
    return 0;
}

    //VC6.0运行结果  =_=Linux下gcc编译不是这个结果,不同的编译器编译结果不同,这个探究可忽略
    9       8       8       9       -8      -9
    -----------------
    8       7       8       8       -8      -8

  • 这又涉及到C的特性:语句编译时从右往左
& 取变量地址
  • scanf("%d",&a);
sizeof 计算变量/类型的大小
  • sizeof(int)
逗号运算符 隔开几个表达式
    int x;
    x=1,2,3+4,5,7;   x最后的值是1

其他
  • [] 下标运算符
  • . 点运算
  • -> 箭头运算符
  • *指针运算符
  • () 函数
  • {}语句

其他后面介绍

优先级

  • 这个不需要记,需要用的时候查表就可以
  • 从上到下优先级降低
  • 不清楚优先级顺序加()
运算符优先级.jpg
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,372评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,368评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,415评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,157评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,171评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,125评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,028评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,887评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,310评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,533评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,690评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,411评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,004评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,812评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,693评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,577评论 2 353

推荐阅读更多精彩内容