- 如果表达式指向并修改了了同一个对象,将会引发错误并且产生未定义的行为。
例如:
int i; cout<<i<<" "<++i<<endl; //未定义的
编辑器可能先 ++i 再输出i, 也可能先输出i, 再 ++i。 结果是不可控的。所以不管结果是什么都是错的。
再比如表达式 f() + g() * h() +j(),如果这四个函数不会改变同一对象,也不会进行io操作,那么这句话中,先调用哪个函数无关紧要。 反之,如果影响同一对象就会产生未定义的行为,是错误的表达式。
2.
bool b = true;
bool b2 =-b; //b2 是true
首先 b为true 会被转换成1, b2 = -1, -1!=0, 所以b2 也是true
3.
比较运算符
if(i<j<k) 错误,i<j返回值是布尔值, 之后布尔值再和k进行比较
if(i<j && j<k) //正确
4.应该使用++i,而不是i++, i++,会保留原始的i,如果用不到原始的i值,这会造成一种性能浪费, 所以要用++i。、
当我们又要使用原来的值,又要递增该变量,就可以使用后置运算符i+
举例:
auto pbeg = v.begin() while(pbeg!=v.end() ) cout<<*pbeg++<" "; cout<<endl;
4.21
# include<iostream> # include<string> # include<vector> using namespace std; int main() { vector<int> nums; cout<<"please enter some whole numbers:"; int n; while(cin>>n && n!='\n') { nums.push_back(n); } for(auto &t : nums) { int result = (t%2 ==1) ? 1 : 0; cout<<result<<endl; if(result == 1) t = 2*t; } for(auto &t : nums) cout<<t<<" "; cout<<endl; return 0; }
4.23
string pl = s + (s[s.size() - 1] == 's' ? "" : "s") ;
4.24
左结合会引起矛盾,不成立。
4.30
(a) (sizeof x) +y
(b) sizeof(p->mem[i])
(c) (sizeof a) < b
(d) 无需改变。
const
顶层host:表示指针本身是一个常量。
底层host:表示指针所指的对象是一个常量。
int i =0;
int *const p1 = &i; // 不能改变p1的值, 这是一个顶层const
const int c1 = 42; //不能改变c1的值,这是一个顶层const
const int *p2 = *c1; //允许改变p2的值,这是一个底层const
const_cast
const_cast的目的并不是为了让你去修改一个本身被定义为const的值,因为这样做的后果是无法预期的。const_cast的目的是修改一些指针/引用的权限,如果我们原本无法通过这些指针/引用修改某块内存的值,现在你可以了。
#include<iostream> using namespace std; int main() { const int a = 12; const int *ap = &a; //这是一个底层const int* tmp = const_cast<int*>(ap); *tmp = 11; cout<<a; }