c - printf(..) 参数的执行顺序是什么?

标签 c printf

<分区>

我想做这样的事情 printf("%d,%d",array[c], array[c+1]),只有一个变量在每次迭代中增加。我写了下面的代码,我期望“1,2”到标准输出,我错了:

#include <stdio.h>
int main()
{
    int c = 1;
    printf("%d,%d",c++,c++); /* 2,1 */
    //printf("%d,%d",c,c++);   /* 2,1 */
    //printf("%d,%d",c++,c);   /* 1,2 */
}

如果我尝试执行 printf("%d,%d",c++,c)printf("%d,%d",c,c++) ,我可以看到“c++”语句没有定义的执行顺序。

有人可以解释一下我编写的代码是如何编译的吗?以及它为什么以及如何根据“c++”语句的位置而变化。

最佳答案

函数调用中参数的求值顺序是未指定的, 并且这些表达式的求值之间没有序列点。这意味着 - 如果一个表达式作为副作用改变了一个对象(如 c 的值),而该对象也被另一个表达式访问 - 这些表达式的结果将是不可预测的。出于这个原因,该语言将这种情况定义为未定义的行为(参见,例如,this 在线 C 标准草案):

6.5 Expressions

2.) If a side effect on a scalar object is unsequenced relative to either a different side effect on the same scalar object or a value computation using the value of the same scalar object, the behavior is undefined. ...

关于c - printf(..) 参数的执行顺序是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54560843/

相关文章:

谁能帮助我理解这个特殊的 union 例子?

c++ - popen() 和 printf 与 C++ 中的 cout 之间的奇怪交互

strstr() 中的着色匹配子字符串

将 char 数组转换为 double

linux - 将 ttyUSB* 设备存储在数组中的 C 程序

c - 如何读取用户输入的字符串并进行分配?

c - 在 Tic-Tac-Toe 游戏中从 MiniMax 算法中获得最佳着法

c - 将数据从串行端口传输到文本文件

c++ - 打印 n 个空格字符 -(f)printf 格式

C 使用 fread 读取未知数量的数据