gpt4 book ai didi

c - printf中栈的使用; gcc 未指定的行为

转载 作者:太空宇宙 更新时间:2023-11-04 06:15:42 24 4
gpt4 key购买 nike

<分区>

当我们在单个 printf 中对同一个变量使用多个赋值时会发生什么?当然,这是一种未指定的行为。但是 gcc 的行为如何? (我希望行为独立于 gcc 版本)

例子:

int a=30;  
printf("%d %d %d %d",a=12,a++,a=a+1);

上面的代码片段给出了输出
12 31 12

a=30;  
printf(" %d %d %d %d ",a--,a=12,a++,a=a+1);

给出输出
12 11 31 11

a=30,b=100;  
printf("%d %d %d %d %d %d %d %d ",a=12,b++,a++,a=200,b=20,a++,a=a+2,b=40);

给出输出
12 20 200 12 21 32 12 21

a=30,b=100;  
printf("<outside>(%d chars for inside printf) %d %d %d %d ",
printf("<inside> %d %d %d %d ",a=12,b++,a++,a=200),b=20,a++,a=a+2,b=40);

给出输出
12 20 200 12(内部 printf 为 22 个字符)21 32 12 21

我们发现的解释是求值是从右到左进行的,赋值采用每个变量的最终值,而其他表达式似乎被压入堆栈?这是一个很好的解释还是那里发生了其他事情?

(注意:gcc 可能使用了一些寄存器而不是堆栈。但行为似乎是一样的)

我的老师解释说每个变量都有一个管道,当 %d 刷新管道时,它的内容不会丢失。因此,当另一个 %d 再次使用该变量时,将再次使用管道的旧内容。

注意:前递增和前递减被视为赋值,而后递增和后递减被视为“其他表达式”。

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com