static int callFirst(int a) {
std::cout<<"callFirst "<< a <<"\n";
return ++a;
}
static int callSecond(int a) {
std::cout<<"callSecond "<< a <<"\n";
return --a;
}
static void print(int a, int b) {
std::cout<<"a"<<a<<"b"<<b<<std::endl;
}
void whoCallFirst(){
int a=10;
print(callFirst(++a),callSecond(a--);
}
以上代码在标准库中属于顺序未定义情况,打印出任何值都是合法的,甚至崩溃
当调用print时一般认为调用顺序callFirst——callSecond,但实际上是不确定的,callFirst,callSecond本身参数++a还是a–先调用顺序也是未定义的,根据计算机实现来的
一般会这样写,不要在一个大函数里做太复杂的变量加减,可能以自己想不到的顺序来执行
void whoCallFirst(){
int a=10;
++a;
auto f = callFirst(a);
auto s = callSecond(a);
a--;
print(f,s);
//print(callFirst(++a),callSecond(a--);
}
以下代码可能因为不知道new的先后顺序会造成资源泄漏:
newa和newb失败会抛出异常,当抛出异常已经分配好的资源会释放掉,给A分配足够内存和调用A构造函数是两个过程,对B也一样,所以当给A分配足够内存,给B分配足够内存,此时如果调用A构造函数失败B就资源泄漏了。正确做法应该将newa和newb放入变量中再传入
class A{};
clsss B{};
void print (A* a, B* b){
try{
//return ;假设是没有的
//do some
}catch(...){
}
delete a;
delete b;
void whoCallFirst(){
try{
print(new A(), new B());
}catch(...){
}
}
ps:这也是面试官喜欢考面试者的一个问题考察面试者C++基础,这个时候要千万注意别掉陷阱,本身在开发中就是非常少见的问题,如果此时面试者因为不确定答案就蒙就掉陷阱了,因为写任何答案都是错误的,这个答案编译器也不确定