文章目录【C语法】加减乘除模 与 类型的强制转换1. 四则混合运算与取模运算符1.1 加减乘运算1.2 除与模运算2. 类型的强制转换【C语法】加减乘除模 与 类型的强制转换在 C/C 中也有加减乘除还有一个模运算但是它们有一些奇妙的组合来完成一些意想不到的操作。还有 C/C 中的类型强制转换1. 四则混合运算与取模运算符1.1 加减乘运算加减乘非常好理解就是左边一个数右边一个数可以相加、相减和相乘ab// a 与 b 相加a-b// a 与 b 相减a*b// a 与 b 相乘当然你也可以在一个数字前面加一个-表示这个数的相反数C 中乘除模的优先级比加减高如果你想改变优先级可以加上一对括号就像这样a * b c a × b c a\times bca×bca * (b / (c d)) a × [ b ÷ ( c d ) ] a\times \left[b\div(cd) \right]a×[b÷(cd)]a * (b * (c d) * e) a × [ b × ( c d ) × e ] a\times[b\times(cd)\times e]a×[b×(cd)×e]1.2 除与模运算为什么会把加减乘与除模分开呢在 C/C 中除号运算符会根据运算符左右的类型是整型还是浮点型来进行不同的操作而模的话又有一些限制条件如果左右两边的数字或变量之间有一个是浮点型那么就表示两数相除最终的结果始终是浮点数类型否则如果都是整型就表示两个数字做带余除法相除后的商。这个符号写作/10/3// 结果返回 3 类型为 整型10.0/3// 返回结果3.333 类型为 浮点型我们会发现两个整数a , b a, ba,b相除最终的结果等于⌊ a b ⌋ \lfloor \cfrac{a}{b} \rfloor⌊ba​⌋也就是两个整数相除后向下取整的结果且不会进行类型转换那么有了向下取整又应该如何两个整数a , b a, ba,b相除以后向上取整的结果呢第一种方法是使用 C语言的math.hC 的cmath库中的函数ceil(x)向下取整floor(x)向零取整trunc(x)四舍五入round(x)但是这些函数都是对于小数使用的虽然整数也可以但是不保险也不安全因为会进行浮点数与整数的类型转化可能会导致精度丢失从而计算错误第二种方法就是列一个数学公式了。我们知道向上取整会将这个小数向上拉在结果为整数时不管。所以假如要求⌈ a b ⌉ { a ∈ N , b ∈ N } \lceil \cfrac{a}{b} \rceil \{ a\in\mathbb{N},b\in\mathbb{N}\}⌈ba​⌉{a∈N,b∈N}那么这个数字的结果就等于⌊ a b − 1 b ⌋ \lfloor \cfrac{ab-1}{b} \rfloor⌊bab−1​⌋两数相除四舍五入保留到整数呢我们知道四舍五入的规则是假如保留整数那么就看第一位小数⩾ 5 \geqslant5⩾5那么向上舍入否则 5 \lt55就向下舍入。所以一个数字如果 0.5 0.50.5再向下舍入就可以得到四舍五入的结果r o u n d ( a b ) ⌊ a b 0.5 ⌋ round(\cfrac{a}{b})\lfloor \cfrac{a}{b} 0.5 \rfloorround(ba​)⌊ba​0.5⌋r o u n d ( x ) round(x)round(x)表示 对x xx四舍五入。但是如果 0.5 0.50.5也会强制类型转换所以我们可以让向下取整中× 2 \times2×2里面算完后再÷ 2 \div2÷2得r o u n d ( a b ) ⌊ 2 ( a b 0.5 ) 2 ⌋ r o u n d ( a b ) ⌊ 2 a b 1 2 ⌋ round(\cfrac{a}{b})\left\lfloor \cfrac{2(\cfrac{a}{b} 0.5)}{2} \right\rfloor \\ round(\cfrac{a}{b})\left\lfloor \cfrac{\cfrac{2a}{b} 1}{2} \right\rfloor \\round(ba​)​22(ba​0.5)​​round(ba​)​2b2a​1​​要求代码求出⌊ a b ⌋ { a ∈ N , b ∈ N } \left\lfloor \cfrac{a}{b} \right\rfloor \left\{ a \in \mathbb{N}, b \in \mathbb{N} \right\}⌊ba​⌋{a∈N,b∈N}a / b求出⌈ a b ⌉ { a ∈ N , b ∈ N } \left\lceil \cfrac{a}{b} \right\rceil \left\{ a \in \mathbb{N}, b \in \mathbb{N} \right\}⌈ba​⌉{a∈N,b∈N}(a b - 1) / b求出r o u n d ( a b ) { a ∈ N , b ∈ N } round\left(\cfrac{a}{b}\right) \left\{ a \in \mathbb{N}, b \in \mathbb{N} \right\}round(ba​){a∈N,b∈N}(2 * a / b 1) / 2那么模运算又是什么呢在数学公式中表示为a m o d b a \bmod bamodb在C最终表示为%表示两个整数作带余除法最终的余数是多少17%5// 结果为 221%3// 结果为 0也就是a m o d b a − ⌊ a b ⌋ { a ∈ [ 0.. ∞ ) , b ∈ [ 0.. ∞ ) } a \bmod ba -\left\lfloor \cfrac{a}{b} \right\rfloor\left\{ a\in[0..\infin),b\in[0..\infin) \right\}amodba−⌊ba​⌋{a∈[0..∞),b∈[0..∞)}那么假如有一个或两个数是负数呢例如-17 % 5等于多少17 % -5等于多少-17 % -5又等于多少在 C 中左数的正负符号就是右数的正负符号而右边取绝对值正负不影响结果17%5// 等于 2-17%5// 等于 -217%-5// 等于 2-17%-5// 等于 -2但是在 Python 中模后的结果始终是正数这个叫做真模运算。想要让 C 也有这个效果那么就需要这么写(a % m m) % ma是被模数m是模数在 C 中不允许使用%让两个之中有一个浮点数的式子运算想要运算需要使用math.h库中的fmod(a, m)函数来对小数取模a是被模数m是模数2. 类型的强制转换在 C语言中提供了一种转换方法强制类型转换。强制类型转换的语法十分简单就是将这个变量/表达式用括号框起来再在前面加上转换后的类型也加上括号也就是(类型)(表达式)表达式可以是一串算式可以是一串代码对于整型int、长整型long、双长整型long long和浮点型float/double/long double类型的数字之间的转换而言整型后面什么都不加长整型后面加一个l双长整型后面加上ll浮点型后面加一个.就够可能看起来不靠谱但是真的能运行不过含有.的都是浮点型在 C 中提供了两种转换方法static_cast类型(表达式)、dynamic_cast类型(表达式)第一种在程序运行前自动转换第二种在程序运行中转换的依赖 RTTI运行时类型识别。这样安全性更高但在信奥赛中有些小题大做不如强制转换编写 C 小程序时就刚好一共有四种但剩下两种转换并不安全const_cast类型(表达式)与reinterpret_cast类型(表达式)#includeiostreamusingnamespacestd;intmain(){cout20./6.endl;// 输出 3.33333cout1234567890ll11451410086ll32767987654321llendl;// 输出 32780673632297}