• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > C 语言基础教程(我的C之旅开始了)[九]

C 语言基础教程(我的C之旅开始了)[九]

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了c语言基础教程课程,编程基础教程c语言,c语言基础教程,零基础学c语言教程,java语言基础教程等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

24. +、-、*、/、= 的优先级

1. 优先级

    和数学一样,C 语言规定先乘除后加减。也就是说,乘法运算符和除法运算符的优先级(Precedence)比加法运算符和减法运算符高。同时,C 语言也规定,如果两个运算符的优先级相同,并且它们之间没有被优先级比它们高或者低的运算符隔开,则它们的运算顺序根据它们在语句中出现的先后而定。大多数运算符都是从左向右进行运算的,不过也有从右向左进行运算的(例如赋值运算符)。乘法运算符和除法运算符的优先级相同,加法运算符和减法运算符的优先级相同。因此,以下语句

        var = 8.0 + 20.0 / 4.0 * 2.0;

运算顺序为:

        20.0 / 4.0
        5.0 * 2.0  (20.0 / 4.0 得 5.0)
        8.0 + 10.0
        var = 18.0

在这个表达式中,/ 和 * 优先级相同,而且是从左向右进行运算的,所以先运算 20.0 / 4.0,然后才轮到 5.0 * 2.0。

    如果我们想让加法先进行,可以给 8.0 + 20.0 加上括号:

        var = (8.0 + 20.0) / 4.0 * 2.0;

这个语句的运算顺序为:

        8.0 + 20.0
        28.0 / 4.0
        7.0 * 2.0
        var = 14.0

    C 语言规定,先进行括号里面的运算,后进行括号外面的运算。在括号里面,运算顺序和上面讨论的一样。例如:

        var = (8.0 + 20.0 / 4.0 * 2.0) / 3.0;

运算顺序为:

        20.0 / 4.0
        5.0 * 2.0
        8.0 + 10.0
        18.0 / 3.0
        var = 6.0

下表总结了这几个运算符的优先级以及它们的结合律,按优先级从高到低进行排列

        运算符             结合律

          ()               从左向右
       + -(单目)         从右向左
         * /               从左向右
       + -(二目)         从左向右
          =                从右向左


2. 优先级和运算顺序

    运算符优先级(Operator precedence)是决定运算顺序的重要规则,但不能完全(也没必要完全)确定运算顺序。例如:

        5 * 3 + 8 * 4;

根据运算符优先级,我们知道,乘法运算先于加法运算。但是 5 * 3 和 8 * 4 谁先谁后,我们并不能确定。它们运算的先后是由编译器决定的。这是因为某种运算顺序在某种系统中效率更高,而另一种运算顺序在另一种系统中效率更高。无论它们的运算先后如何,最终得到的结果都是 47。

    您可能会说:“乘法不是从左向右进行运算的吗?这不是说明最左边的乘法最先进行吗?”是的,乘法的确是从左向右进行运算,但是您也要看到,这两个乘法运算符之间被加法运算符隔开了!我们举一个例子来说明乘法从左向右进行运算的意思。以下语句

        5 * 2 * 9 * 4;

运算顺序为:

        5 * 2
        10 * 9
        90 * 4


下面我们来看一个小程序。

        /* precedence.c -- 优先级测试 */
        #include <stdio.h>

        int main(void)
        {
            int var1, var2;

            var1 = var2 = -(9 + 4) * 5 + (6 + 8 * (7 - 1));
            printf("var1 = var2 = %d\n", var1);

            return 0;
        }

请认真阅读以上程序,想想会出现什么结果,然后编译运行,看看运行结果和您想象的是否一样。

    首先,括号运算符优先级最高。但是 (9 + 4) 和 (6 + 8 * (7 - 1)) 运算的先后是由编译器决定的。假设 (9 + 4) 先进行,则运算后得 13,然后负号运算符作用于 13 得 -13。于是我们得到:

        var1 = var2 = -13 * 5 + (6 + 8 * (7 - 1));

在 (6 + 8 * (7 - 1)) 中,先运算 (7 - 1),得:

        var1 = var2 = -13 * 5 + (6 + 8 * 6);

因为 * 优先级高于 +,于是我们得到:

        var1 = var2 = -13 * 5 + (6 + 48);

进而

        var1 = var2 = -13 * 5 + 54;
        var1 = var2 = -65 + 54;
        var1 = var2 = -11;

因为赋值运算是从右向左的,所以 -11 被赋值给 var2,接着 var2 被赋值给 var1。最终的结果是,var1 和 var2 相等,它们的值都是 -11。


 

25. 模除运算符 %

 

    % 是模除运算符(Modulus Operator),用于求余数。% 只可用于对整数进行模除,不可用于浮点数。例如:

          15 % 2       // 正确。余数为 1
          15.2 % 3     // 错误!

C99 以前,并没有规定如果操作数中有负数,模除的结果会是什么。C99 规定,如果 % 左边的操作数是正数,模除的结果也是正数;如果 % 左边的操作数是负数,模除的结果就是负数。例如:

    &

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C 语言基础教程(我的C之旅开始了)[十]
  • C 语言基础教程(我的C之旅开始了)[九]
  • C 语言基础教程(我的C之旅开始了)[八]
  • C 语言基础教程(我的C之旅开始了)[七]
  • C 语言基础教程(我的C之旅开始了)[六]
  • C 语言基础教程(我的C之旅开始了)[五]
  • C 语言基础教程(我的C之旅开始了)[四]
  • C 语言基础教程(我的C之旅开始了)[三]
  • C 语言基础教程(我的C之旅开始了)[二]

相关文章

  • 2017-05-28从string类的实现看C++类的四大函数(面试常见)
  • 2017-05-28C语言位图算法详解
  • 2017-05-28C++之boost::array的用法
  • 2017-05-28C++通过自定义函数找出一个整数数组中第二大数的方法
  • 2017-05-28Cocos2d-x人物动作类实例
  • 2017-05-28C++实现数组的排序/插入重新排序/以及逆置操作详解
  • 2017-05-28深入理解数组指针与指针数组的区别
  • 2017-05-28C++ CTreeview的checkbox使用方法
  • 2017-05-28MFC对话框中添加状态栏的方法
  • 2017-05-28C++ 11实现检查是否存在特定的成员函数

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • Mac下使用Eclipse编译C/C++文件出现 launch failed, binary not found 解决方案
    • C++ 模版双向链表的实现详解
    • C++实现二叉树遍历序列的求解方法
    • 解析C语言中空指针、空指针常量、NULL & 0的详解
    • C++中给二维指针分配内存(实现代码)
    • C++函数参数取默认值的深入详解
    • 利用反射获得类的public static/const成员的值实例
    • C++实现简单遗传算法
    • 解析C++中的for循环以及基于范围的for语句使用
    • C++实现一个线程安全的单例工厂实现代码

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有