首页 > 试题广场 >

在上下文及头文件均正常的情况下,以下代码输出结果为?

[单选题]
函数func的定义如下:
void func(const int& v1, const int& v2){
    std::cout << v1 << ' ';
    std::cout << v2 << ' ';
}
在上下文及头文件均正常的情况下,以下代码在vs中输出结果为____。
int main (int argc, char* argv[]){
    int i = 0;
    func(++i, i++);
    return 0;
}
  • 0 1
  • 1 2
  • 2 1
  • 2 0
  • 程序强制终止并报错
  • 结果与编译器有关
我试着跑了一遍。
还是编译器视力好,我都没看出来,哈哈
语法错误: 标识符“cont” 

编辑于 2015-10-21 15:57:20 回复(3)
更多回答
未定义行为

C++ Standard, section 5.2.2/8:
The order of evaluation of arguments is unspecified. All side effects of argument expression evaluations take effect before the function is entered. The order of evaluation of the postfix expression and the argument expression list is unspecified.

ref : http://www.open-std.org/jtc1/sc22/open/n2356/expr.html


具体也可以见 Effective C++ 条款17 调用顺序可能引发的问题。

你们出题的人能负点责么?
编辑于 2015-08-28 11:29:28 回复(12)
c语言函数参数的入栈顺序为由右向左。切记 mark下。
发表于 2017-06-05 20:42:43 回复(2)
题目已经明确说明Visual studio编译器了,还和编译器有关?题目难道问的不是在visual studio中的结果么?
发表于 2017-06-21 17:01:15 回复(4)
函数参数成员的执行,从右向左,先执行i++。但是i++是先使用后增加,所以i作为形参传给函数,后自增1,i变为1。在执行++i,i变为2作为形参传给函数.
发表于 2016-06-01 14:39:07 回复(0)
注意,函数参数入栈顺序是从右向左;
栈由高地址向低地址生长,堆由低地址向高地址生长;
栈由系统分配和管理,堆由程序员分配和管理;
发表于 2017-09-08 09:11:33 回复(1)
右值还能取引用?
发表于 2016-05-10 15:14:31 回复(2)
C语言函数参数入栈顺序为由右向左,func(++i, i++)可以分解为 : 参数 i 先入栈 输出0 , 然后执行i++ 此时i为1 , 接着参数 i 先执行++i   i 此时为2  **栈进行输出 2。
发表于 2015-09-05 10:32:09 回复(2)
形参压入栈的时候,是先从参数的最右边开始压栈,所以本题先压入i++,但i++先结束表达式还回0,然后在进行自增变为1
其次在压入++i,也就是2,所以输出2 0。
发表于 2019-08-17 15:28:30 回复(0)
C语言函数参数入栈顺序为由右向左,func(++i, i++)可以分解为 : 参数 i 先入栈 输出0 , 然后执行i++ 此时i为1 , 接着参数 i 先执行++i   i 此时为2  **栈进行输出 2。
发表于 2019-02-18 21:02:55 回复(0)
引用++I和i++有问题啊,++i返回i的左值,但是i++返回的只是i的值而非左值。怎么引用,引用明确规定了只能引用一个左值呀
发表于 2021-08-28 11:48:39 回复(0)
1、函数参数入栈前会先对参数进行遍历和计算,并且参数入栈的顺序为从右到左;
2、前置++和后置++用于实参时的区别:
前置操作:直接对原值进行计算操作,压参时也是将原值压入栈中;
后置操作:先将原值保存到临时变量中,在对原值进行计算操作,压参时将临时变量压入栈中;
所以,对参数进行遍历和计算后,i的值为2,临时变量的值为0,相当于v1为2,v2为0;
(以上已通过VS的汇编代码证实,如有错误,欢迎讨论!)
发表于 2019-08-02 18:43:30 回复(0)
VS编译器使用的是Windows API默认的函数调用约定
Windows API默认的为函数参数调用方式为Stdcall
Stdcall:参数的入栈顺序为从右向左,所以i++,++i
I++返回一个临时变量的引用值为0,但是i的值已经变成1了
++i返回i变量的引用,自加前值为1 ,自加之后i的值变为2
所以答案为0,2
   ps:sdtcall,由被调用函数清除栈内数据
    前缀++和后缀++
原型 
int& pre_increment(int &a) //前缀++返回变量的引用
{
    a = a + 1;
    return a;
}

int post_increment(int &a) //后缀++返回临时值
{
    int temp = a;
    a = a + 1;
    return temp;
}

发表于 2018-11-06 14:38:02 回复(0)
表示java的遇到了这道题 跪了 心塞
发表于 2015-08-27 15:02:58 回复(0)
Ze头像 Ze
C语言函数参数入栈顺序为由右向左,func(++i, i++)可以分解为
参数 i 先入栈 输出0 
然后执行i++ 此时i为1 
接着参数 i 先执行++i   i 此时为2  后入栈进行输出 2
编辑于 2017-06-07 11:08:45 回复(8)
这个符合多态原则么
发表于 2021-07-25 01:00:56 回复(0)
每天一个小细节
发表于 2021-03-08 19:31:25 回复(0)
常见考点 类内成员初始化顺序还有这里函数形参的顺序
发表于 2020-09-05 01:12:04 回复(0)

C语言中入栈的顺序由右向左

发表于 2020-04-12 10:37:09 回复(0)