【问题标题】:post and pre increment, decrement in c++C++ 中的 post 和 pre 递增、递减
【发布时间】:2011-04-17 03:37:16
【问题描述】:
#include <iostream>
using namespace std;

void f(int x, int y){

        cout << "x is " << x << endl;
        cout << "y is " << y << endl;
}



int main(){

        int i = 7;
        f(i--,i-- );
        cout << i << endl<< endl;
}

我们希望程序打印“x is 7 \n y is 6 \n i is 5”

但程序打印“x 是 6 \n y 是 7 \n i 是 5”

【问题讨论】:

    标签: c++


    【解决方案1】:

    f(i--,i-- ); 调用Undefined Behaviour。不要写这样的代码。

    编辑

    上述表达式中的逗号, 不是Comma operator。它只是分隔参数的分隔符(并且不是序列点。)

    此外,函数参数的求值顺序未指定,但表达式调用未定义行为,因为您尝试在两个序列点之间修改 i 两次。

    我累了。 :(

    【讨论】:

    • 完全同意。在同一语句中使用两次 {in,de} 减量运算符是非常糟糕的。
    • @Downvoter :答案完全正确。请解释您的反对意见。
    • @Svisstack : 函数调用中的, 不是comma operator,它只是一个分隔符,它不是一个序列点。
    • @Svisstack:你确定它们在所有平台上都以相反的顺序被推入堆栈...?
    • @Swisstack:参数评估顺序未指定,因此可以是它们被压入堆栈的顺序,也可以不是。 C/C++ 并没有向你承诺任何东西。在这种情况下,i 的值在同一个表达式中被修改了两次(中间没有任何序列点)。如果你这样做,行为是未定义的。 (参见第 5/4 节“在前一个序列点和下一个序列点之间,一个标量对象的存储值最多只能通过表达式的评估修改一次。”)
    【解决方案2】:

    这告诉您参数是从右到左进行评估的,而不是像预期的那样从左到右。这可能是因为调用约定或其他原因,但依赖函数参数评估的顺序通常是一个坏主意。

    【讨论】:

    • 这是调用约定,参数从右到左压入堆栈
    • @Aillyn:错了。它们可能是它对您的编译器的工作方式,但实际上并未在标准中定义。谁说参数甚至放在堆栈上进行函数调用。 (如果这是 C,你可能更正确,但这是 C++ 并且 ABI 未定义(故意))。
    猜你喜欢
    • 2013-06-18
    • 1970-01-01
    • 2015-12-23
    • 1970-01-01
    • 2015-10-03
    • 2017-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多