C++高级进阶 第三季:求余运算符+运算符结合律

一、求余运算符

%用于求余数,优先级与*和/相同,结合律也是从左至右。

要求两个操作数均为整数(或可以隐式转换成整数的类型),故:14.2%3就是错误的,因为double不能隐士转换为整形。

#include <iostream>
using namespace std;

int main()
{
    char c=253;
    int i=5;
    cout<<c%2<<endl;
    cout<<i%c<<endl;
    cout<<19%10%5<<endl;

    return 0;
}

输出:
-1
2
4

在c/c++中,char可视作单字节整形,取值范围-128~127,故可以参与求余。

253对应的二进制是0xFD,即-3的补码表示,C99标准规定:

如果%是正数,有 a%(-b) == a%b;如果%左边是负数,有(-a)%b == -(a%b)

有因为%是从左向右结合,所以19%10%5相当于(19%10)%5,结果是4

二、运算符结合律

Operator precedence and associativity-运算符的优先级和结合性,下表是C语言的运算符优先级和结合性表格

运算符的结合性是指相同优先级的运算符在同一个表达式中,且没有括号的时候,运算符和操作数的结合方式,通常有从左到右结合和从右到左结合两种方式。举个例子,假设~是一个运算符,又有表达式a~b~c,如果~是左结合的,那么该表达式被解析为(a~b)~c,如果~是右结合的,那么该表达式将被解析为a~(b~c)。比如上表中三目运算符?:是从右向左结合的,那么下面的表达式a > b ? b > c ? 1 : 0 : 2将被解析为 a > b ? (b > c ? 1 : 0) : 2。

时间: 2024-09-10 22:17:04

C++高级进阶 第三季:求余运算符+运算符结合律的相关文章

使用与运算符代替求余运算符的技巧

1.性能对比: 求余运算:a MOD b就相当与a-(a DIV b)*b 的运算. 与运算:就是一个指令的事 2.在特殊场景下,是否能用与&替代%呢? 在对10进行求余的时候,我们发现,余数总是整数中的个位上的数字,而不用管其他位是什么:在与运算中,我们经常需要使用位操作符&来取某 些位上的值,例如使用0xff&0x17ae来获取低8位的值,现在我们已经发现有点关联了,如果求余结果值的范围刚好跟是[0,求余的底数 (a%b中的b))集合一样,那么低位就是求余的结果. 1 23%1

在Word2010公式中添加求反关系运算符

第1步,打开Word2010文档窗口,单击需要添加求反关系运算符的公式使其处于编辑状态,并将插入条光标定位到目标位置,如图1所示. 图1 单击需要添加求反关系运算符的公式 第2步,在"公式工具/设计"功能区的"符号"分组中单击"其他"按钮打开符号面板,然后单击顶部的下拉三角按钮.在打开的下拉菜单中选择"求反关系运算符"选项,并在打开的求反关系运算符面板中选择所需的求反关系运算符即可,如图2所示. 图2 选择添加求反关系运算符

C++高级进阶 第一季:const 详解

零.文章来由 打算将基础知识在看书的同时系统的整理一下,方便大家也方便自己.整理的知识尽量参照书本知识,比网上获取的资料有更高的可信度. 一.从 文字常量和常变量 开始 补充:const并没有想象中的那么简单,详见新博文<C++底层知识 第三季:const详解(二)> 1.文字常量 程序中的特殊标识符或表达式,由于同时满足: (1)不可寻址(放在代码区) (2)值不可变 所以可视为文字常量.他们是 静态数组名.枚举变量.全局(静态变量)首地址.#define定义的常量. 整型文字常量: (1)

java中的取整(/)和求余(%)

1.取整运算符取整从字面意思理解就是被除数到底包含几个除数,也就是能被整除多少次,那么它有哪些需要注意的地方呢?先看下面的两端代码: int a = 10; int b = 3; double c= a / b; System.out.println(c); 第一段代码的运行结果是3.0, 其中double c = a / b;//c = (10/3) = (double)3 = 3.0,这里面涉及到一个低精度到高精度的隐式装换. int a = 10; int b = 3; double c=

SCO UNIX高级进阶(一)

第七节高级进阶 1.问题:我改了 hosts 文件,譬如: 127.0.0.1 localhost改成: 127.0.0.1 local 不重起系统,怎样让它生效? 答:# tcp stop # tcp start 建议:好多地方要用到本机的反馈地址的,建议不要修改!!! 2.问题:我想修改主机名,如何修改? 答:如果想修改主机名,用uname -S 主机名. 3.问题:怎么看我的SCO是多少用户? 答:uname -X 在liences manager中也可以看到!! uname -A 更好

《高级进阶DB2(第2版)——内部结构、高级管理与问题诊断》之我见

<高级进阶DB2(第2版)--内部结构.高级管理与问题诊断>之我见 从IT开发与运维角度来分析,千千万万的业务应用系统,最核心的最有价值的是业务数据:而这些多年来积累与沉淀下来的数据依托于数据库系统,数据库系统是否稳定与性能高低则是考验数据库内核,而作为核心之重的数据库内核则是各种商用与开源数据库服务器软件实现与关注的重点所在. 从数据库服务器软件的市场来看,DB2所占据的地位与份额真是犹如乒乓球界的王晧与羽毛球界的李宗伟,长期占居千年老二之位,位亦如其名啊(*_*) 作为要立志成为资深的DB

mod-一道关于求余的证明题

问题描述 一道关于求余的证明题 一道证明题,已知条件为 n>m,能不能由此推出 n mod m< n/2,本人数学很稀烂,求解答,谢谢 解决方案 反证. 假定余数为 r,求余必定满足 ① r < m ② r + m <= n. A)假如 r = n/2,按①可以出 m > n/2,不能满足②(一半+一半多>整个). B)假如 r > n/2,按①可以出 m > n/2,不能满足②(一半多+一半多>整个).

C++高级进阶 第二季:mutable 关键字

零.文章来由 打算将基础知识在看书的同时系统的整理一下,方便大家也方便自己.整理的知识尽量参照书本知识,比网上获取的资料有更高的可信度. 一.作用 mutable 用来解决常函数中不能修改对象的数据成员的问题. 如果在一些情况下,希望在常函数中仍然可以修改某个成员变量的值,就在该变量前加上mutable.能在保证常量对象大部分数据成员仍然"只读"情况下,实现对个别成员的修改. #include <iostream> #include <string> using

Lua中关于求模与求余的区别介绍_Lua

我觉得很多人搞不清楚这两个概念的区别,刚好在翻译lua手册时遇到%与math.fmod这两个操作,顺便做一下说明吧. 求模与求余的区别. 假设对a与b两个整数做求模或求余操作.那么第一步是先求整数商c,即a / b的值,第二步是计算模或余数:a - c * b.求模与求余的区别在于怎么处理a / b的值. 求模运算时,a / b的结果向无穷小方向舍入,求余运算时a / b的结果向0方向舍入. 因此,求模时结果的符号与b一致,求余时结果的符号与a一致. 在Lua中4%(-3)等于-2,由此可以看出