printf的执行顺序&++i与i++的区别

2023-05-16

问题的由来:在学习C语言预处理命令时看到这样一段(https://www.cnblogs.com/clover-toeic/p/3851102.html)

#define SQUARE(x) ((x)*(x))
int Square(int x){
    return (x * x); //未考虑溢出保护
}

int main(void){
    int i = 1;
    while(i <= 5)
        printf("i = %d, Square = %d\n", i, Square(i++));

    int j = 1;
    while(j <= 5)
        printf("j = %d, SQUARE = %d\n", j, SQUARE(j++));

    return 0;
}

执行结果为

i = 2, Square = 1
i = 3, Square = 4
i = 4, Square = 9
i = 5, Square = 16
i = 6, Square = 25
j = 3, SQUARE = 1
j = 5, SQUARE = 9
j = 7, SQUARE = 25

不太搞得懂这里printf的执行顺序。

这是我所查到的解释
printf()函数的参数,在printf()函数读取时是从左往右读取的,然后将读取到的参数放到栈里面去,最后读取到的就放在栈顶,处理参数的时候是从栈顶开始的,所以是从右边开始处理的.
所以printf的执行顺序是从 从右到左进行运算

但是在不同编译器又会采用不同的理解方式,对上面这个例子,我的理解是这样的,假如这段代码是以右结合的方式执行的,那么先执行的就是Square(i++),在执行i++时,i还是等于1,但是在执行完Square(i++)后,i就已经被赋值为2,于是输出为2,1。

但是!
当我在自己的VS2019中尝试时,结果又不一样了

int main() {
	int i = 3;
	printf("%d,%d,%d\n", i++,++i,i);
	printf("i is %d\n", i);
}

从右结合的角度理解,执行结果应该是4,4,3,也有人的执行结果是这个。
但是我的执行结果:
在这里插入图片描述
很懵逼。跟查到的结果很不一样。
(i++是输出i的值,执行完语句后再赋值,++i是直接赋值)。
这跟我查到的很多解析都不一样。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

printf的执行顺序&++i与i++的区别 的相关文章

  • printf什么时候打印失败?

    C 中的 printf 函数并不总是在屏幕上打印输出 例如 如果您忘记将 n 放在字符串末尾 则您正在 printfing 有时您不会得到 o p printf 不打印时是否还有其他一些情况 我记得有人说过这样的条件有7个 你们可以帮忙吗
  • 添加自定义转换类型以进行字符串格式化

    python 中是否有向字符串格式添加额外的转换类型 使用的标准转换类型 基于字符串的格式化是这样的s对于字符串 d我想要做的是添加一个新字符 我可以为其指定一个自定义处理程序 例如 lambda 函数 该处理程序将返回要插入的字符串 例如
  • printf("%d") 不显示我输入的内容

    My code printf Enter a number scanf d number printf d is what I entered n number I input 2 预期输出 2 is what I entered 实际输出
  • printf 忽略单个反斜杠 '\'

    我有这个代码 int main int argc char argv int i printf d s argc argv 1 return 0 如果我运行这段代码a out a b 我在用C shell 其输出为 a b 有什么方法可以将
  • 为什么当我们使用相同的源和目标时 sprintf 和 snprintf 的行为不同?

    我有一个使用 sprintf 的简单代码 include
  • printf 转换 long long 时出现问题

    我一直在研究一个项目欧拉问题 该问题本质上迫使您使用具有大存储空间的数据类型 include
  • printf 中可以使用指向字符串的指针吗?

    我在想这样的事情 include
  • 将可变参数传递给 printf [重复]

    这个问题在这里已经有答案了 我想要一个辅助功能log它主要执行以下操作 log file array has d elements n 10 writes 2014 02 03 16 33 00 array has 10 elements
  • JavaScript 相当于 printf/String.Format

    我正在寻找一个与 C PHP 相当的 JavaScriptprintf 或者对于 C Java 程序员来说 String Format IFormatProvider对于 NET 我的基本要求是目前数字的千位分隔符格式 但处理大量组合 包括
  • printf 类型提升和符号扩展

    我对 printf 和一般情况下类型提升如何发生感到困惑 我尝试了以下代码 unsigned char uc 255 signed char sc 128 printf unsigned char value d n uc printf s
  • bash + for循环+输出索引号和元素

    这是我的数组 ARRAY one two three 如何打印数组以便得到如下输出 index i element i 使用printf or for我在下面使用的循环 1 one 2 two 3 three 一些笔记供我参考 打印数组的1
  • 在 MATLAB 中使用 sprintf 显示变量的小数

    我不明白接下来会发生什么sprintf http www mathworks se help techdoc ref sprintf html命令 gt gt vpa exp 1 53 ans 2 718281828459045534884
  • 向 printf 传递太多参数

    任何已经工作了一周以上的 C 程序员都遇到过因调用而导致的崩溃printf格式说明符多于实际参数 例如 printf Gonna s and s s crash burn 然而 当你通过时 是否会发生类似的糟糕事情 too manyprin
  • 格式化整数时 printf 中的精度字段

    当我执行这两行时 printf 5d n 3 use of precision filed printf 05d n 3 use of 0 flag to prepend with 0 我得到以下输出 00003 00003 结果相同 所以
  • 如何在 C++ 中的特定坐标处将字符串打印到控制台?

    我正在尝试在控制台中的指定坐标处打印字符 到目前为止我一直在使用非常丑陋的printf 033 d dH s n 2 2 str 但我只想问 C 是否有其他方法可以做到这一点 问题甚至不在于它丑陋 当我试图让自己成为一个更漂亮的函数时 问题
  • printf 中的 # 标志如何工作?

    include
  • printf 似乎忽略了字符串精度

    所以 我有点难受 根据man 3 printf在我的系统上 字符串格式 5s 应使用指定的精度来限制从给定字符串参数打印的字符数 man 3 printf PRINTF 3 BSD Library Functions Manual PRIN
  • 从 CUDA 设备写入输出文件

    我是 CUDA 编程的新手 正在将 C 代码重写为并行 CUDA 新代码 有没有一种方法可以直接从设备写入输出数据文件 而无需将数组从设备复制到主机 我假设如果cuPrintf存在 一定有地方可以写一个cuFprintf 抱歉 如果答案已经
  • OCaml 中的用户定义打印机

    printf fprintf等 全部接受 a转换 手册上说对于 a 用户定义的打印机 采用两个参数 并将第一个参数应用于 outchan 当前输出通道 和第二个参数 因此 第一个参数的类型必须为 out channel gt b gt un
  • 需要在python中找到print或printf的源代码[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在做一些我不能完全谈论的事情 我

随机推荐