前言
5 运算符介绍
5.1 算数运算符
算术运算符是对数值类型的变量进行运算的,在C程序中使用的非常多。
运算符 | 运算 | 范例 | 结果 |
+ | 正号 | +3 | 3 |
- | 负号 | b=4;-b | -4 |
+ | 加 | 5+1 | 6 |
- | 减 | 6-2 | 4 |
* | 乘 | 2*3 | 6 |
/ | 除 | 5/5 | 1 |
% | 取模(取余) | 7%5 | 2 |
++ | 自增(前):先运算后取值 自增(后):先取值后运算 | a=2;b=++a; a=2;b=a++; | a=3;b=3 a=3;b=2; |
-- | 自减(前):先运算后取值 自减(后):先取值后运算 | a=2;b=--a; a=2;b=a--; | a=1;b=1 a=1;b=2 |
5.1.1 / 和 % 的使用
/ 的使用:整数除以一个整数还是一个整数,有小数的部分都将会截断,希望保留小数就必须在运算中有浮点数参加。(见下面代码)
%的使用:取模运算只能使用在整数的计算中,给出一个取模公式:a % b = a - a / b * b。
#include <stdio.h>
int main()
{
// 处理流程 10 / 4 = 2.5 截取整数===》2 ==》2.0000
double d1 = 10 / 4;
double d2 = 10 / 4.0; //如果希望保留小数,参与运算必须有浮点数
int n1 = -10 / 3; //-3
int n2 = 10 / -3; //-3
// 取模公式
// a % b = a - a / b * b (C语言中的计算)
int res1 = 10 % 3; // 求10/3的余数1
int res2 = -10 % 3; //-10 - (-10) / 3 * 3 = -10 - (-3) * 3 = -1
int res3 = 10 % -3; // 10 - 10 / (-3) * (-3) = 10 - (-3) * (-3) = 1
printf("d1 = %f, d2 = %f\n", d1, d2);
printf("n1 = %d, n2 = %d\n", n1, n2);
printf("res1 = %d, res2 = %d, res3 = %d\n", res1, res2, res3);
return 0;
}
运行结果:
d1 = 2.000000, d2 = 2.500000
n1 = -3, n2 = -3
res1 = 1, res2 = -1, res3 = 1
5.1.2 ++ 和 -- 的使用
前置:a = ++b
变量自增(减)1;
取变量值。
后置:a = b++
取变量值;
变量自增(减)1。
#include <stdio.h>
int main()
{
int i = 10;
int j = i++; // j = i; i = i + 1; ===> j =10, i =11
printf("i = %d, j = %d\n", i, j);
int k = ++i; // i = i + 1; k = i; ===> k = 12; i = 12;
printf("i = %d, k = %d\n", i, k);
// ++ 和 -- 可以独立使用,就相当于自增或者自减
// i++ ===> i = i + 1
// ++i ===> i = i + 1
// 如果独立使用 i++ 和 ++i 完全等价
i++; // i = 13
printf("i = %d\n", i);
++i; // i = 14
printf("i = %d\n", i);
return 0;
}
运行结果:
i = 11, j = 10
i = 12, k = 12
i = 13
i = 14
5.2 关系运算符(比较运算符)
5.2.1 关系运算符简介
1)关系运算符的结果要么是真(非0表示,默认使用1),要么是假(0表示);
2)关系运算符组成的表达式,被称之为关系表达式;
3)比较运算符 "=="(关系运算符)不能误写成 "="(赋值)。
#include <stdio.h>
int main()
{
int a = 10, b = 11;
printf("a > b = %d\n", a > b); // 0
printf("a < b = %d\n", a < b); // 1
printf("a >= b = %d\n", a >= b); // 0
printf("a <= b = %d\n", a <= b); // 1
printf("a == b = %d\n", a == b); // 0
printf("a != b = %d\n", a != b); // 1
return 0;
}
5.3 逻辑运算符
5.3.1 逻辑运算符简介
假设变量A的值为1,变量B的值为0,逻辑运算符的表达见下表:
运算符 | 描述 | 例子 |
&& | 逻辑与,如果两个操作数都为非0(真),则条件为真,否则结果为0(假) | (A && B)为假 |
|| | 逻辑或,如果两个操作数中有任意一个非0(真),则结果为真 | (A || B)为真 |
! | 逻辑非,逆转操作数的逻辑状态,如果条件为真则逻辑非运算符将使其为假 | !(A && B)为真 |
5.3.2 逻辑运算符的注意事项
逻辑与(&&):在进行&&操作时,如果第一个条件为false,则后面的条件不在判断。
这种现象称之为短路现象,所以逻辑与也称之为短路逻辑与。
逻辑或(||):在进行||操作时,如果第一个条件为真,则不再执行后面的条件,整个结果为真。
这种现象称之为逻辑或短路现象,因此逻辑或也称之为短路逻辑或。
短路逻辑与代码演示:
#include <stdio.h>
int main()
{
int a = 10, b = 20;
if ((a < 5) && (++b > 20))
printf("真真真\n");
printf("b = %d\n", b); // b = 20
if ((a > 5) && (++b > 20))
printf("真真真\n");
printf("b = %d\n", b); // b = 21
return 0;
}
短路逻辑或代码演示:
#include <stdio.h>
int main()
{
int a = 5, b =20;
if ((a > 5) || (++b > 20))
printf("真真真\n");
printf("b = %d\n", b); // b = 20
if ((a < 5) || (++b > 20))
printf("真真真\n");
printf("b = %d\n", b); // b = 21
return 0;
}
5.4 赋值运算符
5.4.1 赋值运算符简介
赋值运算符就是将某个运算后的值,赋值给指定变量。
运算符 | 描述 | 例子 |
= | 简单的赋值运算符,把右边操作数的值赋值给左边操作数 | C = A + B,将把A + B的值赋值给C |
+= | 加且赋值运算符,把左边操作数加上右边操作数的结果赋值给左边操作数 | C += A相当于C = C + A |
-= | 减且赋值运算符,把左边操作减去右边操作数的结果赋值给左边操作数 | C -= A相当于C = C - A |
*= | 乘且赋值运算符,把左边操作数乘以右边操作数的结果赋值给左边操作数 | C *= A相当于C = C * A |
/= | 除且赋值运算符,把左边操作数除以右边操作数的结果赋值给左边操作数 | C /= A相当于C = C / A |
%= | 求模且赋值运算符,求两个操作数的模赋值给左边的操作数 | C %= A相当于C = C % A |
<<= | 左移且赋值运算符 | C <<= 2 相当于 C = C << 2 |
>>= | 右移且赋值运算符 | C >>= 2 相当于 C = C >> 2 |
&= | 按位与且赋值运算符 | C &= 2 相当于 C = C & 2 |
^= | 按位异或且赋值运算符 | C ^= 2 相当于 C = C ^ 2 |
|= | 按位或且赋值运算符 | C |= 2 相当于 C = C | 2 |
5.4.2 赋值运算符特点
1)运算顺序从右到左;
2)赋值运算符的左边只能是变量,右边可以是变量、表达式、常量值;
3)复合赋值运算符的表达含义:a += 3 ===> a = a + 3。
5.5 位运算符
5.5.1 原码、反码、补码
对于有符号的而言:
1)二进制的最高位时符号位:0表示正数,1表示负数;
2)正数的原码、反码、补码都一样(三码合一);
3)负数的反码 = 它的源码符号位不变,其它位取反(0 -> 1, 1 -> 0);
4)负数的补码 = 它的反码 + 1;
5)0的反码、补码都是0;
6)在计算机运算的时候,都是以补码的方式来运算的。‘
5.5.2 位运算符的简介
位运算符作用于位,并逐位执行操作。
运算符 | 描述 |
& | 按位与操作,按二进制位进行“与”操作。运算规则:0&0=0;0&1=0;1&0=0;1&1=1 |
| | 按位或操作,按二进制位进行“或”操作。运算规则:0|0=0;0|1=1;1|0=0;1|1=1 |
^ | 按位异或操作,按二进制位进行“异或”操作。运算规则:0^0=0;0^1=1;1^0=1;1^1=0 |
~ | 按位取反运算,按二进制位进行“取反”运算。运算规则:~1=0;~0=1 |
<< | 按位左移运算,将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0) |
>> | 按位右移运算,将一个数的个二进制位全部右移若干位,正数左边补0,负数左边补1,右边丢弃。 |
5.5.3 位运算符说明
1)按位与&:两位全为1,结果为1,否则为0;
2)按位或|:两位有一个为1,结果为1,否则为0;
3)按位异或^:两位一个为0,一个为1,结果为1,否则为0;
4)按位取反~:0 -> 1,1 -> 0;
5)算数右移>>:低位溢出,符号位不变,并用符号位补溢出的高位;
6)算数左移<<:符号位不变,低位补0;
7)逻辑左移和逻辑右移是针对无符号整数的。
举例说明:
在计算机运算的时候,都是以补码的方式来运算的。
5.6 三元运算符
5.6.1 基本语法
条件表达式?表达式1:表达式2
1)如果条件表达式为真,运算后的结果为表达式1;
2)如果条件表达式为假,运算后的结果为表达式2;
#include <stdio.h>
int main()
{
int a = 10;
int b = 15;
int res = a > b ? a++ : b--;
printf("a = %d, b = %d, res = %d\n", a, b, res); // a = 10, b = 16, res = 15
return 0;
}
5.7 标识符的命名规则和规范
5.7.1 标识符概念
1)C语言对各种变量、函数等命名时使用的字符序列称为标识符;
2)凡是自己可以起名字的地方都叫标识符。
5.7.2 标识符的命名规则
1)由26个英文字母大小写,0-9,_或$组成;
2)数字不可以开头;
3)不可以使用关键字和保留字,但能包含关键字和保留字;
4)C语言中严格区分大小写,长度无限制;
5)标识符不能包含空格。
5.7.3 标识符命名规范
1)程序中不得出现仅靠大小写区分的相似标识符;
例如:int x,X; 变量x和X容易混淆
2)所有宏定义、枚举常数、常量(只读变量)全用大写字母命名,用下划线分割单词;
例如:const double TXA_RATE = 0.09;
#define FILE_PATH "/usr/temp"
3)定义变量别忘记初始化。定义变量时编译器并不一定清空了这块内存,它的的值可能时无效的数据,运行程序,会异常退出;
4)变量名、函数名:多单词组成时,第一个单子首字母小写,第二个单词开始每个单词首字母大写:temp_Power(驼峰法,小驼峰)
每个单词的首字母都大写:TankShotGame(大驼峰)