C++每日一课(十八)

递增/递减运算符和指针
可以把递增运算符用于指针和基本变量。把递增运算符用于指针时,会把指针的值增加其指向的数据类型占用的字节数,这种规则适用于对指针的递增和递减。
double a[]{1.1,1.2,1.3,1.4}
double * pt = a; //这个时候指针指向的是a[0]
++pt; //这个时候指针指向的是a[1]


也可以结合使用*运算符来修改指针指向的值。
前缀递增、前缀递减和解除引用运算符*的优先级是一样的,以从右到左的方式进行结合。
后缀递增和后缀递减的优先级是相同的,但是比前缀运算符的优先级更高,这两个运算符以从左到右的方式进行结合。


前缀运算符的从右到左结合规则意味着*++pt的含义如下:先把++应用于pt(因为++位于*右边),然后把*应用于被递增后的pt。
double x = *++pt; //这个时候先把指针指向的位置递增后再做取值
++*pt; //这个则会先把pt当前指针指向的值取出来再把对应取出的值加1
(*pt)++; //这个表示把pt的值取出来再把对应的值加1


x = *pt++;
后缀运算符++优先级更高,这就会意味着先把++运算符用于pt,然而后缀运算符意味对原来的地址而不是递增后的地新地址做解除引用,这个语句执行完成后,pt的值会指向下一个元素的地址。




组合赋值运算符
i = i+n;
C++中可以使用加法和赋值操作的运算符
i+=n;


+=运算符把两个操作数相加,并把结果赋给左边的操作数。这就意味着左边的操作数必须可以被赋值。


int k = 1;
k += 2;


10 += 10; //这个是错误的因为左边的是一个字面数值常量,它是不可以进行赋值的


组合赋值运算符
+=
-=
*=
/=
%=


复合语句(语句块)
编写C++ for语句的格式(或句法)看上去比较严格,因为循环体必须是一条语句。如果要在循环体中包含多条语句必须使用{}把多条语句括起来形成一个复合语句块




/*
作者:xiesheng
时间:2017-07-15
版本:v1.0
说明:语句块
*/
#include <iostream>


int main() {


	using namespace std;
	cout << "计算输入数值的和与平均值." << endl;
	double number;
	double sum = 0.0;
	cout << "请输入五个值:" << endl;
	for (int i = 1; i <= 5; i++) {
		cout << "value " << i << ": ";
		cin >> number;
		sum += number;
	}
	
	cout << "五个值输入完成!" << endl;
	cout << "这五个值的和为:" << sum << endl;
	cout << "这五个值的平均值是:" << sum / 5 << endl;


	system("pause");
	return 0;
}






计算输入数值的和与平均值.
请输入五个值:
value 1: 12.8
value 2: 14.6
value 3: 2.6
value 4: 1.5
value 5: 6.7
五个值输入完成!
这五个值的和为:38.2
这五个值的平均值是:7.64
请按任意键继续. . .


对于上面可以看到for的循环体需要执行一堆语句而不是单一的语句,这个时候需要把这些语句全部包含在{}中。
注意:在复合语句中如果声明一个变量,则这个新声明的变量只在这个语句块中有效,执行完语句块后变会释放这个变量。


如果在语句块内部声明的变量在外部也声明了同样的变量,则在语句块中使用新声明的变量,当语句块执行结束后,语句块中声明的变量会释放无效,而之前外部声明的变量则变为有效。


逗号运算符
逗号运算符对表达式完成同样的任务,允许把两个表达式放到C++句法只允许放一个表达式的地方。
假如有一个循环在每轮执行后把一个变量加1,把另一个变量减1。在for循环控制的更新部分中完成这个工作则可以如下
++i,--j
注意:逗号不总是运算符,如下
int i,j; //这个只是使用逗号把变量列表中相邻的名称分开而已


/*
作者:xiesheng
时间:2017-07-15
版本:v1.0
说明:逗号运算符
*/
#include <iostream>
#include <string>


int main() {


	using namespace std;
	cout << "请输入一串字符:";
	string word;
	cin >> word;
	char temp;
	int i, j;
	for (j = 0, i = word.size() - 1; j < i; --i, ++j) {
		//对字符进行交换
		temp = word[i];
		word[i] = word[j];
		word[j] = temp;
	}
	cout << word << endl;
	system("pause");
	return 0;
}





请输入一串字符:xiesheng
gnehseix
请按任意键继续. . .


逗号运算符如下说明:
逗号运算符确保先执行第一个表达式,再计算第二个表达式,也就是说逗号运算符是一个顺序点。
逗号表达式的值是第二部分的值
i = 10,20;
这个时候被解释成{i=10},20;
这个时候20不起作用,括号的优先级最高,下面的语句会把值设置为20
i = (10,20);


关系表达式
计算机可以对值进行比较,这种能力是计算机决策的基础。
在C++中,关系运算符可以进行数值比较,由于字符使用ASCII码表示,因而也可以把这些运算符用于字符。
所有的关系表达式比较的结果为真则值是true,否则为false。因而可以把它用作为循环测试表达式。
< 小于
<= 小于或者等于
== 等于
> 大于
>= 大于或者等于
!= 不等于


注意:关系运算符的优先级比算述运算符低
x+2>y-1
上面的表达式可以理解为(x+2)>(y-1)
注意 == 这个是关系运算符 = 这个是赋值运算符,不要混淆
不要使用=来比较两个量是否相等,如果要比较要使用关系运算符==


C风格字符串比较
比如有一个字符数组word,如下关系运算
word = "xiesheng"
这里word是数组的首地址
引号括起来的字符串常量也是其地址,上面这个关系表达式不是判断字符串是否相同,而是看它们是不是存储在相同的地址上。
两个字符串的地址不是相同的就算他们包含相同的字符。
使用C风格字符串库函数strcmp()可以进行比较。
strcmp()
这个函数接受两个字符串地址作为参数。如果两个字符串相同,则返回0,如果第一个字符串按字母顺序排在第二个字符前则会返回一个负数,如果第一个字符串按字母顺序排在第二个字符串后则会返回一个正数。
字符是根据字符的系统编码来进行比较的。比如使用ASCII码的话大写字母都是比小写字母小的。


/*
作者:xiesheng
时间:2017-07-15
版本:v1.0
说明:字符串比较
*/
#include <iostream>
#include <cstring>


int main() {


	using namespace std;
	char word[4] = "xie";
	for (char ch = 'a'; strcmp(word, "sie");ch++) {
		cout << word << endl;
		word[0] = ch;
	}


	cout << "循环后的结果:" << word << endl;


	system("pause");
	return 0;
}





xie
aie
bie
cie
die
eie
fie
gie
hie
iie
jie
kie
lie
mie
nie
oie
pie
qie
rie
循环后的结果:sie
请按任意键继续. . .


string类字符串的比较
如果是string类字符串而不是c风格的字符串,比较起来比较简单些,因为类设计让你可以使用关系运算符来进行比较。


/*
作者:xiesheng
时间:2017-07-15
版本:v1.0
说明:字符串比较
*/
#include <iostream>
#include <string>


int main() {


	using namespace std;
	string word = "xie";
	for (char ch = 'a'; word != "sie"; ch++) {
		cout << word << endl;
		word[0] = ch;
	}
	cout << "循环后的结果:" << word << endl;


	system("pause");
	return 0;
}




xie
aie
bie
cie
die
eie
fie
gie
hie
iie
jie
kie
lie
mie
nie
oie
pie
qie
rie
循环后的结果:sie
请按任意键继续. . .


上面的程序可以看出string类重载了!=运算符,要使用它必须至少有一个操作数是string对象,另一个则可以string对象或都是C风格的字符串。
string类的设计可以把string对象作为一个实体,也可以把它作为一个聚合对象,从而使用数组表示法来提取其中的字符。

猜你喜欢

转载自blog.csdn.net/advent86/article/details/75195265