C++学习笔记1

这篇博客详细介绍了C++中的操作符用法,包括数组通过指针赋值,位运算的优先级,如何设置和检查位,赋值操作符的规则。此外,还讨论了解引用和自增操作的组合使用,以及如何找到三个变量的最大值。最后,提到了动态创建对象的初始化方式。
摘要由CSDN通过智能技术生成

 

1.  操作符的含义——该操作符执行什么操作以及操作结果的类型——取决于操作数的类型。

 

2.  数组通过指针赋值

int ia[10];

ia[0] = 0;              // ok: subscript is an lvalue

*ia = 0;                 // ok: dereference also is an lvalue

 

int ival; int *pval;

 ival = pval = 0     // error: cannot assign the value of a pointer to an int

 string s1, s2;

 s1 = s2 ="OK";   // ok: "OK"converted to string

3. 位运算优先级

移位操作符具有中等优先级:其优先级比算术操作符低,但比关系操作符、赋值操作符和条件操作符优先级高。若IO 表达式的操作数包含了比IO 操作符优先级低的操作符,相关的优先级别将影响书写该表达式的方式。通常需使用圆括号强制先实现右结合:

 cout << 42 +10;             // ok, + has higherprecedence, so the sum is printed

 cout << (10< 42);           // ok: parenthesesforce intended grouping; prints 1

 cout << 10 <42;              // error: attempt tocompare cout to 42!

The second cout is interpreted as第二个cout 语句解释为:

 (cout << 10)< 42;

该表达式说“将10 写到cout,然后用此操作(也就是cout)的结果与42 做比较”

 

4. 位运算

老师可以设置和检查每个位(30)。例如,假设第27 位所表示的学生及格了,则可以使用下面的语句适当地设置对应的位:

 bitset<30>bitset_quiz1;              // bitset solution

 unsigned longint_quiz1 = 0;       // simulated collection of bits

 bitset_quiz1.set(27);                   // indicate student number 27 passed

 int_quiz1 |=1UL<<27;                  //indicate student  number 27 passed

// 1UL <<27; // generate a value with only bit number 27 set

// following assignment is equivalent to int_quiz1 |= 1UL<< 27;

 int_quiz1 = int_quiz1| 1UL << 27;

bitset_quiz1.reset(27);                  //student number 27 failed

int_quiz1 &= ~(1UL<<27);            // student number 27 failed

5. 赋值操作符

 int i, j, ival;

 const int ci = i;                     // ok: initialization not assignment

 1024 = ival;                          // error: literals are rvalues

 i + j = ival;                            // error: arithmeticexpressions are rvalues

 ci = ival;                               // error: can't write to ci

6. 在单个表达式中组合使用解引用和自增操作

下面的程序使用了一种非常通用的C++ 编程模式输出ivec 的内容:

 vector<int>::iterator iter =ivec.begin();

 // prints 10 9 8 ...1

 while (iter !=ivec.end())

 cout << *iter++<< endl; // iterator postfix increment

 

如果程序员对C++ 和C 语言都不太熟悉,则常常会弄不清楚表达式*iter++ 的含义。

由于后自增操作的优先级高于解引用操作,因此*iter++ 等效于 *(iter++)。子表达式iter++ 使iter 加1,然后返回iter 原值的副本作为该表达式的结果。因此,解引用操作* 的操作数是iter 未加1 前的副本。 这种用法的根据在于后自增操作返回其操作数原值(没有加1)的副本。如果返回的是加1 后的值,则解引用该值将导致错误的结果:ivec的第一个元素没有输出,并企图对一个多余的元素进行解引用。

 

7. 假设iter 为vector<string>::iterator 类型的变量,指出下面哪些表达式是合法的,并解释这些合法表达式的行为。

vector<int> ivec(10, 1);

vector<int>::iterator iter = ivec.begin();

 

*iter++;

(*iter)++;

iter.empty();                     // X

iter->empty();                   // X

++*iter;

iter++->empty();               // X

 

8. 可以使用一组嵌套的条件操作符求出三个变量的最大值,并将最大值赋给 max:

 int max = i > j

 ? i > k ? i : k

 : j > k ? j : k;

9. 逗号操作符

逗号表达式是一组由逗号分隔的表达式,这些表达式从左向右计算。逗号表达式的结果是其最右边表达式的值。如果最右边的操作数是左值,则逗号表达式的值也是左值。此类表达式通常用于for 循环:

 

10. 动态创建对象的默认初始化

如果不提供显式初始化,动态创建的对象与在函数内定义的变量初始化方式相同。对于类类型的对象,用该类的默认构造函数初始化;而内置类型的对象则无初始化。

 string *ps = newstring;                 // initialized to empty string

 int *pi = new int;                            // pi points to an uninitialized int

同样也可对动态创建的对象做值初始化(value-initialize)

 string *ps = newstring();                // initialized to empty string

 int *pi = new int();                           // pi points to an int value-initialized to 0

 cls *pc = new cls();                         // pc points to avalue-initialized object of type cls

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值