目录
前面教程汇总
第一讲
第二讲
第三讲
运算符
赋值运算符
下表列出了 C 语言和 C++ 支持的赋值运算符:
运算符 | 描述 | 实例 |
---|---|---|
= | 简单的赋值运算符,把右边操作数的值赋给左边操作数 | 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语言的基本数据类型,包括 char
、int
和 double
,字符串(字符数组)不能使用赋值运算符。
算术运算符
下表显示了 C 语言和 C++ 支持的所有算术运算符。假设变量 A 的值为 18,变量 B 的值为5,则:
运算符 | 描述 | 实例 |
---|---|---|
+ | 两个数相加 | A+B 将得到 23 |
- | 一个数减另一个数 | A-B 将得到 13 |
* | 两个数相乘 | A*B 将得到 90 |
/ | 分子除以分母 | A/B 将得到 3.6 |
% | 余数运算符,整除后的余数 | B%A 将得到 3 |
++ | 自增运算符,整数值增加 1 | A++ 将得到 19 |
– | 自减运算符,整数值减少 1 | A-- 将得到 17 |
关系运算符
关系运算(Relational Operators),用于判断条件,决定程序的流程。
关系 | 数学中的表示 | C语言和C++的表示 |
---|---|---|
小于 | < | < |
小于等于 | ≤ | <= |
大于 | > | > |
大于等于 | ≥ | >= |
等于 | = | == |
不等于 | ≠ | != |
C语言和 C++ 的基本数据类型有 char
、int
、double
等,我们暂时认为只有 char
和 int
(对于C++还有 long long
)适用于上述关系运算符,double
和字符串的关系运算以后再讨论。
注意了:
- “=”是赋值,“==”才是判断两个数是否相等,不能混用。
- C语言和C++没有“之间”、“中间”、“之内”或“在某范围内”的关系运算符,例如年龄在25-30岁之间,只能表达为:年龄大于等于25岁
并且 年龄小于等于30岁。
逗号运算符
逗号也是运算符?
是的,但是其实我更愿意说它是分隔符。在C语言和C++中我们就经常使用逗号,看似逗号是非常平凡的分隔符,但是它关联到一个你必须知道但可能未曾思考的小知识:
理论上,每条语句(分号结束),最终都会转换成一个值。
例子1
#include <cstdio>
int main()
{
3, 4, 5;//这是一条语句
//把上面这条语句的值赋值给变量a
int a = (3, 4, 5);
printf("a = %d\n", a);
}
输出结果:
a = 5
因为a的值是整条语句的值,而整条语句的值是最后那个逗号后面的值。
例子2
#include <stdio.h>
int main()
{
int a = 3, b = 4, c = 5;
int x = 0;
int y = (x = a + b), (b + c);
printf("第一个y = %d\n", y);
y = ((x = a + b),(b + c));
printf("第二个y=%d\n", y);
}
输出结果:
第一个y = 7
第一个y = 9
第一个y的值你应该能看懂,就是逗号分隔开,使得y = x = a + b。
第二个y其实就等于逗号后面的 (b + c) 的值!逗号前面那些似乎是多余的
那多余的东西为什么要写呢?请注意:逗号前面有个x的赋值语句,所以并不多余!
这样写的目的有2:
- 简化代码:两句合成一句写.
- 让你理解一个句子就会像一个函数一样有返回值,如果用逗号隔开,这个「返回值」就会变成最后那个表达式的值!
三目运算符(条件运算符)
三目运算符也叫条件运算符、三元运算符,是由一个问号和一个冒号组成。
语法
表达式1 ? 表达式2 : 表达式3;
语义
先执行表达式1,如果表达式1的结果如果为真,那么执行表达式2,并且这个整体的运算式的结果是表达式2的结果;如果表达式1的结果如果为假,执行表达式3,运算式的结果是表达式3的结果。
int a, b, c;
a = 7;
b = 6;
c = (a > b) ? a : b;
等同于
if (a > b) c = a;
else c = b;
三目运算符可以嵌套使用,我不建议使用三目运算符,过于复杂的三目运算难以理解。
比如判断year是不是闰年,是则返回1,不是返回0。
int year;
year = (year % 100 == 0) ? (year % 400 == 0 ? 1 : 0) : (year % 4 == 0 ? 1 : 0);
晕了吧。
sizeof
运算符
sizeof
是 C语言和C++的关键字,它用来计算变量(或数据类型)在当前系统中占用内存的字节数。
sizeof
不是函数,产生这样的疑问是因为sizeof的书写确实有点像函数,sizeof
有两种写法。
用于数据类型
sizeof(数据类型);
数据类型必须用括号括住。
printf("字符型变量占用的内存是 = %d\n", sizeof(char)); // 输出:字符型变量占用的内存是 = 1
printf("整型变量占用的内存是 = %d\n", sizeof(int)); // 输出:整型变量占用的内存是 = 4
用于变量
sizeof(变量名);
sizeof 变量名;
变量名可以不用括号括住,带括号的用法更普遍,大多数程序员采用这种形式。
int ii;
printf("ii占用的内存是=%d\n",sizeof(ii)); // 输出:ii占用的内存是=4
printf("ii占用的内存是=%d\n",sizeof ii); // 输出:ii占用的内存是=4
注意事项
sizeof
(结构体)
理论上讲结构体的各个成员在内存中是连续存放的,和数组非常类似,但是,结构体占用内存的总大小不一定等于全部成员变量占用内存大小之和。在编译器的具体实现中,为了提高内存寻址的效率,各个成员之间可能会存在缝隙。用sizeof可以得到结构体占用内容在总大小,sizeof(结构体名)或 sizeof(结构体变量名)
都可以。
不要对 void
使用 sizeof
printf("sizeof(void)=%d\n",sizeof(void)); // 输出sizeof(void)=1
以上代码在有些编译器中可能无法通过。
void
是无值型或空类型,不知道存储空间大小的类型,编译器也不能确定它的大小。void
不能声明变量,以下代码编译无法通过:
void vv;
但是以下代码是正确的:
void *pv;
printf("sizeof(void*)=%d\n",sizeof(pv)); // 输出sizeof(void)=8
pv
是一个 void
指针,在64位操作系统中,指针变量占用的内存的大小都是8,下同。
不要在子函数中对字符指针用 sizeof
如果把一个字符串(如 char strname[21]
)的地址传给子函数,子函数用一个字符指针(如 char *pstr
)来存放传入的字符串的地址,如果在子函数中用 sizeof(pstr)
,得到的不是字符串占用内存的字节数,而是字符指针变量占用内存的字节数(8字节)。
所以,不能在子函数中对传入的字符串进行初始化,除非字符串的长度也作为参数传入到了子函数中。
不要在子函数中对结构体指针用 sizeof
如果把一个结构体(如 struct st_girl stgirl
)的地址传给子函数,子函数用一个结构体指针(如 struct st_girl *pgril
)来存放传入的结构体的地址,如果在子函数中用 sizeof(pgirl)
,得到的不是结构体占用内存的字节数,而是结构体指针变量占用内存的字节数(8字节)。正确的用法是用 sizeof(struct st_girl)
。
以上就是我为大家带来的“C++入门教程(四、运算符与表达式)”,大家学会了吗?