美文网首页简友广场C++学习笔记
第三章 数据处理(4)c++算数运算符

第三章 数据处理(4)c++算数运算符

作者: 阿厉a_li | 来源:发表于2019-10-23 12:53 被阅读0次

    (四)c++算数运算符

    1.算数运算符

        c++一共有五种基本的算数运算符,+, -, *, /, %分别是加减乘除求余五种运算,这五种运算就是其它运算的基础。

        其中/的情况比较特殊如果两个数都是整型,则得到的是整型,这一点是应该引起注意的,比如double a=1/3;会得到多少?答案是0,因为1/3会被程序认为是两个整型相除,会得到整型的结果,因此如果目的是要得到精确结果的话应该写成1.0/3,表示一个double和int相除,结果是double类型。

       对于求余运算,余数的符号满足特定的规则,规则是a/b*b+a%b=a因此,如果一个负数%正数,结果将会是负数,其他的可以以此类推

    2.算数运算符的优先级和结合性

        *、/和%位于同一行,它们的优先级相同。同样,加和减的优先级也相同,但比乘除低。从左到右的结合性意味着如果两个优先级相同的运算符被同时用于同一个操作数,则首先应用左侧的运算符。从右到左的结合性则首先应用右侧的运算符。

        这里要注意理解可能产生误区的是优先级和结合性同计算顺序并不是一回事,优先级和结合性是相对于运算符来说的。比如a+b+c*d,c和d之间是*号,它的优先级在这里是最高的,但是并不是意味着要先计算c和d的乘法(优先级和结合性作用于同一个数时才起作用,从而表明运算顺序,而不同的数时不起作用的,具体哪个先计算取决于实现),其实运算的时候可能依然是从左到右的,这个顺序c++并没有很明确的规定

        在C/C++中规定了所有运算符的优先级以及结合性,但是并不是所有的运算符都被规定了操作数的计算次序。在C/C++中只有4个运算符被规定了操作数的计算次序,它们是&&,||,逗号运算符(,),条件运算符(?:)。

        运算符&&和运算符||。首先对左侧操作数求值,只在需要时才对右侧操作数求值。

        运算符?:。有三个操作数据:在a?b:c中,操作数a首先被求值,根据a的值再求操作数b或c的值。

        逗号运算符。首先对左侧操作数求值,然后该值被“丢弃”,再对右侧操作数求值。

    3.除法分支

        除法运算符(/)的行为取决于操作数的类型。如果两个操作数都是整数,则C++将执行整数除法。这意味着结果的小数部分将被丢弃(不是四舍五入,而是直接去掉小数部分),使得最后的结果是一个整数。如果其中有一个(或两个)操作数是浮点值,则小数部分将保留,结果为浮点数。

       使用相同的运算符号进行多种操作叫做运算符重载( operator overloading),c++支持对运算符重载进行扩展,以便可以执行用户自己定义的数据。

    4.类型转换

    (1)C++自动执行很多类型转换(什么时候进行类型转换?):

    •将一种算术类型的值赋给另一种算术类型的变量时,C++将对值进行转换;

    表达式中包含不同的类型时,C++将对值进行转换;

    •将参数传递给函数时,C++将对值进行转换。

    (2)类型转换相关知识

    float 能保证6位有效数字,而double(一般为64位)能保证15位有效数字

    将浮点数转换为整数的时候,小数部分会被去掉(注意不是四舍五入,而是丢掉小数部分),整数部分被保留。

    将0赋给 bool 变量时,将被转换为false,而非零值将被转换为true

    使用大括号形式的列表初始化时(c++11的标准),类型转换只可以向上转换不可以减少精度。

    cout . setf ( ios_base : :fixed, ios_base : : floatfield) ;使用固定位数的浮点形式输出(一般为6位小数,不用科学计数法),有时要尽量以此格式输出。

    (3)自动转换

        首先,一些类型在出现时便会自动转换;其次,有些类型在与其他类型同时出现在表达式中时将被转换。

        先来看看自动转换在计算表达式时,C++将bool、char、unsigned charsigned char和 short的值转换为int具体地说,true被转换为1 , false被转换为0。这些转换被称为整型提升(integral promotion),因为int类型在计算机中计算是最为方便的,效率最高,计算完成之后再将结果转换回去就是了。

    当运算涉及两种类型时,较小的类型将被转换为较大的类型

    (4)强制转换

    通用格式如下:

    ( typeName) value    // converts value to typeName type

    typeName ( value )   //converts value to typeName type

    第一种格式来自C语言,第二种格式是纯粹的 C++,让我们像使用函数一样使用强制类型转换

    c++中更不易出错的类型转换:static_cast<typeName> ( value),如static_cast<int>(throne);

    为了使潜在风险更加细化,使问题追溯更加方便,使书写格式更加规范,C++ 对类型转换进行了分类,并新增了四个关键字来予以支持,它们分别是(先了解,再理解,具体见第15章,友元异常和其他):

    static_cast用于良性转换,一般不会导致意外发生,风险很低。

    const_cast用于 const 与非 const、volatile 与非 volatile 之间的转换。

    reinterpret_cast,高度危险的转换,这种转换仅仅是对二进制位的重新解释,不会借助已有的转换规则对数据进行调整,但是可以实现最灵活的 C++ 类型转换。

    dynamic_cast借助 RTTI,用于类型安全的向下转型(Downcasting)。

    5.C++11中的auto声明

        在初始化声明中,如果使用关键字auto,而不指定变量的类型,编译器将把变量的类型设置成与初始值相同:

    auto n = 100 ;auto x = 1.5 ; auto y = 1.3e12L;

        这种声明的其中一个好处是,有些时候我们不知道变量应该是什么类型,比如后面通过类来定义的对象,但是可以直接通过初始化来使变量跟初始化的数据类型相同。这就是自动类型推断,有时候对编程是有利的。

    象 。 爱

    上一篇:数据处理(3)浮点数

    下一篇:复合类型(1)数组

    相关文章

      网友评论

        本文标题:第三章 数据处理(4)c++算数运算符

        本文链接:https://www.haomeiwen.com/subject/qxnxvctx.html