我打印了上面的行。但是我得到的结果是 65。尽管我在第二次增加了,但我如何增加和打印?
int i=5;
printf("%d%d",i,i++);
您的printf
调用会产生未定义的行为。修改i
(in i++
) 并同时执行独立读取而i
没有中间序列点是非法的。
各种“评估顺序”在这里无关紧要。所有基于“评估顺序”或“之前”发生的事情和“之后”发生的事情来解释此代码行为的所有尝试都是绝对错误的。行为只是未定义的。故事结局。
就 C 语言本身而言,此代码可以打印"Kill all humans!"
、使程序崩溃、格式化您的硬盘驱动器或干脆拒绝编译。
ANSI C99 ISO/IEC 9899:1999 标准说
6.5.2.2 函数调用 函数指示符、实际参数和实际参数中的子表达式的求值顺序未指定,但在实际调用之前有一个顺序点。
正如您刚刚发现的那样,评估的顺序是未指定的。编译器可以自由地以任何顺序评估参数。(在您的情况下, i++ 在 i 之前进行评估。)