经典指数          
原因
1437
浏览数
0
收藏数
 

函数func的定义如下:
void func(const int& v1, cont int& v2)
{
    std::cout << v1 << ' ';
    std::cout << v2 << ' ';
}
 以下代码输出结果为____。
int main (int argc, char* argv[])
{
    int i=0;
    func(++i,i++);
    return 0;
}
  • 0 1
  • 1 2
  • 2 1
  • 2 0
  • 程序强制终止并报错
  • 结果与编译器有关

     举报   纠错  
 
切换
1 个答案
正确答案应该是依编译器不同而不同。 此题的关键在于i++和++i的区别。 i++返回的是一个临时变量,且 i = i + 1; ++i返回的是i本事,且 i = i + 1。 voidfunc(constint& v1, cont int& v2) 这个函数中,首先v2传入的是临时变量的别名。 然后v1传入的i的别名;  所以,调用函数中v1指的是i,v2指的是临时变量。 然后就是i++和++i的计算顺序问题。 虽然传入参数的顺序是从右到左的,但是参数的计算顺序却是未确定的。 所以,如果先计算i++, 再计算++i;则结果为2, 0 如果先计算++i, 再计算i++; 则结果应该是2, 1 在Visual Studio编译器中,其汇编代码如下,所以结果为2, 0 int i = 0; 00385848  mov         dword ptr [i],0   func(++i, i++); 0038584F  mov         eax,dword ptr [i]   func(++i, i++); 00385852  mov         dword ptr [ebp-0D8h],eax  //先计算i++,即临时变量,v2 00385858  mov         ecx,dword ptr [i]   0038585B  add         ecx,1   0038585E  mov         dword ptr [i],ecx  //后计算++i,即变量i, v1 00385861  mov         edx,dword ptr [i]   00385864  add         edx,1   00385867  mov         dword ptr [i],edx   0038586A  lea         eax,[ebp-0D8h]  //取别名v2 00385870  push        eax   //压入参数 00385871  lea         ecx,[i]  //取别名v1 00385874  push        ecx  //压入参数 00385875  call        func (038178Ah)  
 
切换
撰写答案
扫描后移动端查看本题