第四章:条件运算符、位运算符、sizeof运算符知识点及习题答案

一、条件运算符:
条件运算符满足右结合律,意味着运算对象(一般)按照从右向左的顺序组合。条件运算符的嵌套最好别超过两到三层。

 (1)编写一段程序,使用条件运算符从vector中找到哪些元素的值是奇数,然后将这些奇数的值翻倍。
 
									#include 
									#include 
									#include 
									using namespace std;
									int main()
									{
										int a[10] = { 0,1,2,3,6,5,4,7,8,9 };
										vector v1(a, a + 10);
										cout << "Original vector" << "\t";
										for (int i = 0; i < 10; i++)
										{
											cout << v1[i] << " ";
										}
										cout << endl;
										cout << "After the change" << " ";
										for (int i = 0; i < 10; i++)
										{
											int j = ((v1[i] % 2) ? i * 2 : i);//条件表达式的使用
											cout << j << " ";
										}
									}
	分析:考察的知识点:关于条件运算符最主要的两点:cond ? exp1 : exp2。(1)条件运算符的优先级很低嵌套使用时最好加上括号(2)两个表达式的类型需要相同。
(2)本节的示例程序将成绩划分为highpass、pass、fail三种,扩展该程序使其进一步将60分到75分之间的成绩设定为low pass。要求程序包含两个版本:一个版本是使用条件运算符;另一个版本使用一个或者多个if语句。
                  
						#include 
						#include 
						#include 
						using namespace std;
						int main()
						{
							int grade;
							cout << "Please Input the grade :";
							cin >> grade;
							string finalgrade;
							finalgrade = (grade > 90) ? "High pass" : (grade > 75) ? "pass" : (grade > 60) ? "Low pass" : "fail";//条件运算符的嵌套
							cout << finalgrade;
						}
						解析:运用条件运算符的程序进行简单的嵌套。

									#include 
									#include 
									#include 
									using namespace std;
									 int main()
									{
										int grade;
										cout << "Please Input the grade :";
										cin >> grade;
										if (grade <= 90)
										{
											if (grade <= 75)
											{
												if (grade > 60)
												{
													cout << "low pass" << endl;
												}
												else
												{
													cout << "fail" << endl;
												}
											}
											else
											{
												cout << "pass" << endl;
											}
										}
										else
										{
											cout << "High pass" << endl;
										}
									}
                                          解析:运用多重的if语句进行运算。
                                          if语句虽然较为直观,但是不够简洁,而条件运算符的嵌套次数如果过多,则会影响到代码的可读性。
(3)因为运算符的优先级问题,下面这条表达式无法通过编译。根据4.12节中的表(第147页)指出他的问题在哪里?应该如何修改?

   string s=“word”;
   string pl = s+s[s.size()-1]=='s'? "" :"s";
   解析:此处即为条件运算符的优先级过低引起的问题
   修改为:string pl = s + (s[s.size() - 1] == 's' ? "" : "s") ;

二、位运算符
位运算符作用于整数类型的运算对象。

三、移位运算符

四、位求反运算符
位求反运算符(~)将运算对象逐位求反后生成一个新值,将1置为0,将0置为1;

五、位与(&)、位或(|)、位异或(^)运算符

		    原则:位与运算符全1则1;
		    位或运算符有1则1;
		    位异或运算符有且只有一个1则为1;
		    注意:不要将位运算符和逻辑运算符搞混,比如:位与(&)与逻辑与(&&),位或(|)和逻辑或(||)、位求反(~)和逻辑非(!)

六、习题

    (1)如果一台机器上int 占32位、char占8位,用的是Latin-1字符集,其中字符‘q’的二进制形式是01110001,那么表达式~‘q’<<6的值是什么?
    解析:考查的知识点:(a)>> 右移   ——对象是无符号数,左侧插入值为0的二进制位 ; 对象是有符号数,左侧插入符号位的副本或0,视情况而定。(b)<< 左移   —— 右侧插入值为0的二进制位 (箭头指向那边,就往哪运动)(c)~ 位求反。
    需要注意的是题目要求,最后问的是“值”而不是字符了。所以应该由8位转向32位
    最后的结果为:1111 1111 1111 1111 1110 0011 1000 0000   值为:-7296
  (2)下列表达式的结果为?
  unsigned long ul1 = 3,ul2 = 7;
  (a)ul1 & ul2
  (b)ul1 | ul2
  (c)ul1 && ul2
  (d) ul1 || ul2
  解析:注意符号的区别,单符号&、 | 指的是位运算与、或 。 &&是逻辑与运算符,||是逻辑或运算符,都是逻辑运算符,两边只能是bool类型 &与| 既可以进行逻辑运算,又可以进行位运算,两边既可以是bool类型,又可以是数值类型。因此结果为:(a) 3        (b) 7               (c)(d)  true

你可能感兴趣的:(C++Primer学习笔记)