cout vs printf - 执行顺序

nik*_*kel 2 c c++

可能重复:
编译器和C++中的评估参数顺序
cout <<它打印的函数调用顺序?

  1. 这个:

    int k=3;
    printf("%d %d %d",k++,k,++k);
    
    Run Code Online (Sandbox Code Playgroud)

    提供输出,4 4 4因为它们被推入堆栈中:

    %d%d%d
    
    4  -- for k++    
    4  --for k    
    4  --for ++k
    
    Run Code Online (Sandbox Code Playgroud)

    对?

  2. 这个:

    int k = 3;
    cout << k++ << k << ++k;
    
    Run Code Online (Sandbox Code Playgroud)

    实际上是重复的函数调用,所以它相当于:

    ( ( (cout << k++) << k) << ++k);
    
    Run Code Online (Sandbox Code Playgroud)

    所以,我认为首先是k++k然后++k必须按以下顺序执行的,对不对?我相信函数调用是一个序列点,但输出在不同的实现上有所不同.为什么会这样?

Ara*_*raK 7

参数的评估顺序由标准指定.这意味着,它可以按照实现的任何顺序发生.

  • 不,行为未定义.这比没有指定的订单要糟糕得多.如果只是订单未指定,那么该程序的可能输出数量将是有限的.但由于`k`在序列点之间被多次修改,因此调用UB,**可能发生任何**.包括在stdout上打印的猴子的ASCII艺术,或者所有文件被删除. (6认同)