运算符操作
求模运算
求余数(模)%,在CPU中,与除法运算使用同一个运算器,例如 a % b;
注意:
a % b运算结果的正负号与 a 的正负号保持一致,与数学上的定义恰恰相反。int a = 5 % 3, b = -5 % 3;//a为2,b为-2 int c = 5 % -3, d = -5 % -3;//c为2,d为-2只能用于两个整数类型间的运算。
自增++、自减--运算符(放到“循环”中再回过头细讲)
自增运算符++,是一元运算符,将变量的值加1;自减运算符--,也是一元运算符,将变量的值减1。
同求余运算一样,自增、自减不适用于浮点数类型(1)作为前缀时,++a 立即返回加 1 以后的数值;--a 立即返回减 1 以后的数值;
(2)作为后缀时,a++ 先返回 a 原来的值,再将 a 加 1;a-- 先返回 a 原来的值,再将 a 减 1。
#include <stdio.h>
int main() {
int a, b, c = 2;//a, b未被赋值,为随机值
a = c++;//a被赋值为2,c再变为3
b = ++c;//c变为4,b再被赋值为4
printf("%d %d", a, b);//2 4
return 0;
}
#include <stdio.h>
int main() {
int a = 5;
printf("++a: %d, a: %d\n", ++a, a);
a = 5;
printf("a: %d, ++a: %d\n", a, ++a);
a = 5;
//后缀自增、自减运算符的使用“云诡波谲”,请谨慎使用
printf("a++: %d, a: %d, a++: %d\n", a++, a, a++);
a = 5;
printf("a: %d, a++: %d\n", a, a++);
return 0;
}
/*输出结果如下:
++a: 6, a: 6
a: 6, ++a: 6
a++: 5, a: 6, a++: 5
a: 6, a++: 5
*/
赋值运算符

注意:所有的赋值运算都有返回值,其返回值即为被赋予的数值。
关系运算符(放到"条件分支"中再回过头细讲)
下表显示了 C\C++ 支持的关系运算符。
C\C++ 中,0 表示为假(false);所有非0的数均为真(true)

注意:为真,即整个式子返回 1;否则返回 0。
逻辑运算符(放到"条件分支"中再回过头细讲)
下表显示了 C\C++ 支持的关系逻辑运算符。

短路运算1:如果 x && y 中已知 x 为假,则 y 不会执行
短路运算2:如果 x || y 中已知 x 为真,则 y 不会执行
//如果 j 的个位不是 a,则 cnt 保持不变
if (j%10==a && ++cnt==k)
printf("%d", i);
德·摩根律

!(A&&B) == !A || !B
!(A||B) == !A && !B
其中,A 和 B 本身还可以是逻辑表达式。
C++ 中变量的引用
在 C++ 中,我们可以给一个变量同时分配两个或两个以上的名字,使用方式如下:
int a = 5;
//在声明时,变量名前若加了取地址符&,即将该变量与赋值的变量捆绑
//此时,取地址符并非取变量地址,因为这并非是对一个已经声明过的变量取地址
//这种操作称为引用,即给a变量又取了一个名字,叫b
int &b = a;
b += 3;
printf("%d", a);//b加了3,等同于a也加了3
位运算符
位运算符作用于位,并逐位执行操作。&、 | 和 ^ 的真值表如下所示:

假设如果 A = 60,且 B = 13,现在以二进制格式表示,它们如下所示:
A = 0011 1100
B = 0000 1101
-----------------
A&B = 0000 1100
A|B = 0011 1101
A^B = 0011 0001
~A = 1100 0011
//&& 和 || 是把变量作为一个数进行运算的,这里 A 和 B 都非 0,视为true
A && B = 0000 0001
A || B = 0000 0001
下表显示了 C\C++ 支持的位运算符。假设变量 A 的值为 60,变量 B 的值为 13,则:


位运算常见应用
01翻转(异或)
int a = 0;
a ^= 1; // a 变为 1
a ^= 1; // a 变回 0
- 在
01序列串里求1的个数的奇偶性
int c = 1 ^ 0 ^ 1 ^ 1; // c 为 1
- 判断奇偶性
if (c & 1) // 当 c 为奇数时,条件为真
- 乘以 \(2^m\)(例:\(m = 5\))
int c = 1;
c <<= 5; // 将 c 连续乘以 5 次 2
- 除以 \(2^m\)(例:\(m = 3\))
int c = 64;
c >>= 3; // c 连续除以 3 次 2
- 将低 \(m\) 位清 \(0\)
char c = 'a'; // 为了简便,以只有 8 位的 char 类型为例
c &= 0xE0; // 0xE0 的二进制表示为 1110 0000,低 5 位为 0,这里即可以将 c 的低 5 位全部清 0
- 模 \(2^m\) 的余数(保留二进制的低 \(m\) 位,例:\(m=5\))
int c &= (1<<5) - 1;// c 与二进制 11111 进行按位与运算,只有最低的 5 个位可以保留下来,其余位被清 0
- 异或的“和”性质
a^b=c \(\Rightarrow\) a^c=b,b^c=a
优先级
(1)单目运算符 > 双目运算符 > 三目运算符 > 赋值运算符 > 逗号
(2)双目运算中,四则运算优先级最高,其次是几近于四则运算的移位运算,接着是不相等的关系判断,然后是相等的关系判断,其后是位运算,最后是逻辑运算
(3)与 > 异或 > 或
(4)
/和%是同一个运算得到的两个不同结果,优先级相同

运算律整理
对于某种运算 \(\circ\)
- 结合律
\((a\circ b)\circ c=a\circ(b\circ c)\)
-
交换律
\(a\circ b=b\circ a\)
| 运算 | 结合律 | 交换律 |
|---|---|---|
| + | (a + b) + c \(=\) a + (b + c) | a + b \(=\) b + a |
| - | (a - b) - c \(\neq\) a - (b - c) | a - b \(\neq\) b - a |
| * | (a * b) * c \(=\) a * (b * c) | a * b \(=\) b * a |
| / | (a / b) / c \(\neq\) a / (b / c) | a / b \(\neq\) b / a |
| && | (a && b) && c \(=\) a && (b && c) | a && b \(=\) b && a |
| || | (a || b) || c \(=\) a || (b || c) | a || b \(=\) b || a |
| ^ | (a ^ b) ^ c \(=\) a ^ (b ^ c) | a ^ b \(=\) b ^ a |
逗号运算符
逗号运算符的结果,为最后一个逗号(如果有多个逗号)后面的式子的值,如:
int a = (-2, 0, 3);//a=3
int b = (a=0, (a=2)||(a=1), a);//a=2, b=2
b = (a=1, (a=2)&&(a=0), a);//a=0, b=0

数学库的使用
C\C++ 语言数学库里有很多相关的数学函数,查看链接:https://zh.cppreference.com/w/c/numeric/math
//C语言应写为<math.h>
#include <cmath>//加入 C\C++ 语言的数学函数库
常量的使用
正常情况下,变量在计算机里是有读(r-read)写(w-write)两个权限,但有些变量不希望被改写。
大家都知道,在数学里有些常量,如:\(e, \pi\),这些值是永远都不会改变的。我们为了防止在编程时无意中修改了这些常量,引入了const(constant)关键字(如 \(int, float, main, include, \dots\)等 C 语言中有特定意义的单词),专门用来修饰“常量”。
常量通常声明在 main 函数上面,作为
全局变量使用,可以被所有的函数使用。
const int N = 56;//用全大写来命名常量,前面加了const,则 N 不允许被修改了。
const double PI = acos(-1);//需要在上面添加 #include <cmath>
上取整及下取整函数
ceil(x):上取整函数,返回大于等于 x 的最小整数;ceil-ceiling天花板floor(x):下取整,返回小于等于 x 的最大整数。
#include <stdio.h>
#include <math.h>
int main() {
printf("%f %f", ceil(3.14), floor(3.14));//输出 4.000000 3.000000
return 0;
}
#include <iostream>
#include <cmath>
using namespace std;
int main() {
cout << ceil(3.14) << " " << floor(3.14) << endl;//输出 4 3
return 0;
}
另外,还有一种简单的数学方法:
int x = 5, y = (x-1)/3 + 1;//y = 2
求平方根
sqrt(x):求 x 的平方根(正)
三目运算符

由 ? 和 : 隔开的从左往右的 3 个部分,第一部分是条件判断,如果 条件表达 为真,则执行表达式1,否则执行 表达式2,类似如下 if 语句:
if (条件表达) 表达式1;
else 表达式2;
五、字符变量
字符变量占 1 个字节,其中存储的值为其 ASCII 码值,我们可以通过对其进行加减法运算,使其变换为其他字符。
//给字符变量赋值的两种方法:1.通过单引号引起一个字符;2.直接输入对应的ASCII码
char c = 'a', d = 97;//'a'的ASCII码值就是97,所以这里变量 c 和 d 都是存储的字母 'a'
//示例代码1
#include <cstdio>
int main() {
char c = 'a';//字符一定要用单引号
//双引号"a"不是字符,是ASCII码为97和0的两个字符
//双引号内最后一个字符一定是ASCII码为0的空字符
printf("%c", c);
return 0;
}
//示例代码2
#include <cstdio>
int main() {
char c = 'a';//'a'的ASCII码为97
c = c + 3;//97+3=100, 是d的ASCII值
printf("%c", c);
return 0;
}

浙公网安备 33010602011771号