C++编程基础: 6. 语句、表达式和运算符
2025-04-12 09:05:50
本系列文章是配合我发布的《C++编程基础》系列视频教程的知识点总结和补充。这一节我们主要讲讲语句和表达式。
语句
像C++这样的编程语言是由按顺序执行的语句所组成的。C++的语法,每个语句都是以分号;为结尾的,有些语言结尾则不需要分号,例如Python。在输入分号时有一点需要注意的就是不要错误输入中文输入法的全角分号;!
英文输入法的半角的分号;和中文用的全角分号的;(有时肉眼很容易忽略它们的不同)在计算机看来是两个完全不同的字符,所占字节数也不相同。
用大括号括起的多条语句的集合称为语句块或复合语句,当用到条件语句、循环语句时,就经常会看到成对出现的大括号。
建议大家编程时,在键入像大括号这样成对出现的标记(如小括号()、中括号[]
、双引号”“、单引号’’、标记语言的<>
等)时也要成对输入,即先键入{}
,再将光标移到括号中输入其他代码,这样可以有效避免程序因为大括号不匹配造成无法编译的语法错误。现在大多数代码编辑器已经有了很强大的自校验功能,可以指出像左右大括号有缺失的问题,但良好的编程习惯还是应该保留的。
程序中括起复合语句的大括号结尾处一般是没有分号的,如果多了一个分号,程序也并不会报错,因为编译器把它视作为了一个空语句。
表达式
所谓表达式,是由运算符,操作数,标点构成的,用来说明计算过程的序列。它根据约定、优先级(不确定谁优先时可以用小括号辅助)等规则进行计算,例如我们在之前课中遇到的两个整数相除的结果还是一个整数,即使接收它的变量是一个float类型的变量,这就是一种类型转换的约定。
=0.0;
float f_num= 13/7.0;
f_num <<"f_num : "<<f_num<<endl; cout
输出结果: f_num : 1.85714
将f_num = 13/7.0; 改为 f_num = 13/7; 结果变为了1
= 13/7;
f_num <<"f_num : "<<f_num<<endl; cout
输出结果: f_num : 1
在赋值表达式中,等号左右两边的操作数分别称为左值和右值,左值是存放数据的内存空间,它可以是一个变量,但不能是常量,右值则既可以是变量又可以是常量。
改写上面的f_num = 13/7; 把除数7变为变量deno。
= 7;
int deno = 13/deno;
f_num <<"f_num : "<<f_num<<endl; cout
输出结果: f_num : 1
运算符
加减乘除大家都很熟悉,就不在此做介绍了,这里只介绍编程语言中其他几种很有用的运算符
% 取余运算符(或称求模运算符),只能用于整数之间除法运算取余
= 11;
int a = 3;
int b ;
int c= a%b;
c <<"a % b = "<<c<<endl; cout
输出结果: a % b = 2
++ –递增和递减运算符,这两种运算符只用在一个操作数身上,放在操作数前作为前缀和放在操作数后作为后缀代表着先递增/减后赋值还是先赋值后递增/减(递增/减的步长为1)。
如果它在语句里单独出现,两种形式结果一样,都是将操作数递增/减。
++;
a++b;
<<"a++ :"<<a<<endl;
cout<<"++b :"<<b<<endl; cout
输出结果:
a++ :12
++b :4
如果它出现在了一个赋值语句里,如mod_a = a++;则a原有的值会先赋给mod_a,然后a再+1。
//a:12 b:4
= a++;
int mod_a = ++b;
int mod_b <<"mod_a : "<<mod_a<<endl;
cout<<"mod_b : "<<mod_b<<endl; cout
输出结果:
mod_a : 12
mod_b : 5
如果递增或递减的步长不是1,可以用下面的赋值缩写方式:
//mod_a:12 mod_b:5
+=2; //等同于mod_a=mod_a+2;
mod_a-=3; //等同于mod_b=mod_b-3;
mod_b<<"mod_a+=2 : "<<mod_a<<endl;
cout<<"mod_b-=3 : "<<mod_b<<endl; cout
输出结果:
mod_a+=2 : 14
mod_b-=3 : 2
同理,当一个变量出现在赋值表达式的左边,也出现在表达式的右边作为像*、/、%这样的运算符的操作数之一时,也可以使用这样的缩写方式。这类运算符和等号=一样,属于赋值运算符。
//mod_b:2
*=3; //等同于mod_b=mod_b*3;
mod_b<<"mod_b*=3 : "<<mod_b<<endl; cout
输出结果: mod_b*=3 : 6
一些运算符参与的运算结果不是真就是假,在C++里,true的值是1,false的值为0,例如关系运算符:判断相等还是不等的运算符==和!=,比较大小的运算符<, <=, >, >=。
//a:13 b:5 c:2
=a<b;
bool d<<"a<b :"<<d<<endl; cout
输出结果:
a<b :0
逻辑运算符:与&&, 或||,非!。C++中的条件语句经常需要使用关系运算和逻辑运算来判断条件是否成立,条件语句的说明我将在以后课中介绍,这里先用输出命令看一下逻辑运算返回的值会是什么格式。
<<"(a>b)&&(a>c) :"<<((a>b)&&(a>c))<<endl; cout
输出结果:
(a>b)&&(a>c) :1
请注意,上面提到的与和或是由两个重复符号&&,||构成,如果只写一个&或|的话则是按位运算符,按位运算符的返回值不是布尔类型的数据。
按位运算符 NOT(~)、AND(&)、 OR(|)、XOR(^) 中“取反NOT(~)”是对自身取反,而后三个通常是将换算成二进制的整数每一位与另一个二进制整数按位执行“与AND(&)、或OR(|)、异或XOR(^)”的操作,从而得到运算结果。
这里我将逻辑运算符(大写AB代表操作数)和按位运算符(小写ab代表操作数)的真值表合并到了一张表里供大家参考。
当两个操作数进行“与”运算时,只有两个值都为真(1)时,得到的结果才为真。
当两个操作数进行“或”运算时,只要有一个值为真,得到的结果就为真。
在按位做“异或”运算时,两个操作数中有且只有一个操作数为真时,结果才为真,也就是两个操作数不同时,结果才为真。
当单个操作数做“非”运算时,即取反,则假(0)变真,真变假。
按位左移(<<)按位右移(>>)运算符,左移n位,相当于将变量乘以了2的n次方,右移n位,相当于将变量除以了2的n次方
//a:13 b:5
<<"b<<3 :"<<(b<<3)<<endl;
cout//b<<3相当于b乘以2的3次方,这里是5乘以8
<<"a>>1 :"<<(a>>1)<<endl;
cout//a>>1相当于a除以2的1次方,这里是13除以2
输出结果:
b<<3 :40
a>>1 :6
条件运算符的格式很特别,如下所示:
(条件表达式)?(条件为真时的表达式):(条件为假时的表达式)
在还没有学到条件if语句之前, 先来用它热身一下,下面的例子中,在问号?之前的表达式是否为真,如果为真,则返回值为a,否则为b,这里返回值将会是a和b里的最大值。
//a:13 b:5
;
int max=(a>b)?a:b;
max<<"max : "<<max<<endl; cout
输出结果:
max : 13
以上介绍只是C++中常用的一些运算符,在今后的学习中,我们还会碰上其他的运算符,那些就到时再说啦^_^