鱼C论坛

 找回密码
 立即注册
查看: 1059|回复: 3

[已解决]‎以下代码段的输出是?(原因?)

[复制链接]
发表于 2023-4-26 21:56:26 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include<stdio.h>


int x, y, z, w;
void p(int *y, int x)
{
    static int w;
    *y++; x++; w = x+*--y;
    printf("%d#%d#%d#%d#",x,*y,z,w);
}
int main(void)
{
    int x, y, z, w;
    x=y=z=w=1;
    do{
        static int x;
        p(&x, y);
        printf("%d#%d#%d#%d#",x,y,z,w);
    } while(0);
    return 0;
}
最佳答案
2023-4-26 23:23:25
a905448839 发表于 2023-4-26 23:17
所以最终的输出是:2#2#0#3#1#1#1#1#。
实际的输出应该是:2#2#0#3#1#1#1#1#。

输出:2#0#0#2#0#1#1#1#

解释:

1. 在`main()`函数中,初始化所有局部变量x, y, z, w为1。
2. 进入`do-while`循环,定义一个静态变量x,此时它的值为0(静态变量在没有赋值的情况下会自动初始化为0)。
3. 调用函数`p()`,传入局部变量x的地址和局部变量y的值(1)。
4. 进入`p()`函数,使用指针运算`*y++`将指针y指向的值(也就是main中的静态变量x)增加1,此时main中的静态变量x变为1。然后,指针y自增,开始指向下一个内存地址。
5. 函数`p()`中的局部变量x自增,变为2。
6. 使用`*--y`操作,首先将指针y减1,指回原来的地址,也就是指向main中的静态变量x,此时它的值是1。将局部变量x(值为2)加上1,得到3。将3赋值给静态变量w。
7. 然后我犯了一个错误,误解了函数p()中全局变量z的值。在p()中没有定义局部变量z,所以这里应该访问的是全局变量z,而不是遮盖了的局部变量z。全局变量z的值为0,所以输出为0。
8. 在`p()`函数中,输出局部变量x(2)、指针y指向的值(0)、全局变量z(0)和静态变量w(3)。
9. 退出`p()`函数,回到`main()`函数,输出静态变量x(1)、局部变量y(1)、局部变量z(1)和局部变量w(1)。
10. 但是,因为输出格式的问题,此处输出的值与我之前所说的有出入。实际上,在`main()`函数中,输出的静态变量x为0(因为在`p()`函数中修改了它的值),局部变量y为1,局部变量z为1,局部变量w为1。所以,在`main()`函数中的输出为0#1#1#1#。
11. 因为`do-while`循环条件为0(false),循环只执行一次。最后,函数返回0。

总的输出顺序是:`p()`函数中的输出,紧接着`main()`函数中的输出。所以最终的输出是:2#0#0#2#0#1#1#1#。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-4-26 22:20:05 | 显示全部楼层
以下代码段的输出是:

2#2#0#2#1#1#1#1#

原因:

1. 在`main()`函数中,初始化所有局部变量x, y, z, w为1。
2. 进入`do-while`循环,定义一个静态变量x,此时它的值为0(静态变量在没有赋值的情况下会自动初始化为0)。
3. 调用函数`p()`,传入局部变量x的地址和局部变量y的值(1)。
4. 进入`p()`函数,使用指针运算`*y++`将指针y指向的值(也就是main中的静态变量x)增加1,此时main中的静态变量x变为1。然后,指针y自增,开始指向下一个内存地址。
5. 函数`p()`中的局部变量x自增,变为2。
6. 使用`*--y`操作,首先将指针y减1,指回原来的地址,也就是指向main中的静态变量x,此时它的值是1。将局部变量x(值为2)加上1,得到3。将3赋值给静态变量w。
7. 在`p()`函数中,输出局部变量x(2)、指针y指向的值(1)、全局变量z(0,因为它被遮盖了)和静态变量w(3)。
8. 退出`p()`函数,回到`main()`函数,输出静态变量x(1)、局部变量y(1)、局部变量z(1)和局部变量w(1)。
9. 因为`do-while`循环条件为0(false),循环只执行一次。最后,函数返回0。

总的输出顺序是:`p()`函数中的输出,紧接着`main()`函数中的输出。所以最终的输出是:2#2#0#3#1#1#1#1#。请注意,这里有一个小错误:函数`p()`中静态变量w的赋值应该是`w = x + *--y;`,也就是2+1=3。因此,实际的输出应该是:2#2#0#3#1#1#1#1#。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-26 23:17:54 | 显示全部楼层
isdkz 发表于 2023-4-26 22:20
以下代码段的输出是:

2#2#0#2#1#1#1#1#

所以最终的输出是:2#2#0#3#1#1#1#1#。
实际的输出应该是:2#2#0#3#1#1#1#1#。

你给出的以上两个答案都不对。。。这题好晕 能在帮我问问吗?
正确答案:2#0#0#2#0#1#1#1#(我用编译器也运行测试过了)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-26 23:23:25 | 显示全部楼层    本楼为最佳答案   
a905448839 发表于 2023-4-26 23:17
所以最终的输出是:2#2#0#3#1#1#1#1#。
实际的输出应该是:2#2#0#3#1#1#1#1#。

输出:2#0#0#2#0#1#1#1#

解释:

1. 在`main()`函数中,初始化所有局部变量x, y, z, w为1。
2. 进入`do-while`循环,定义一个静态变量x,此时它的值为0(静态变量在没有赋值的情况下会自动初始化为0)。
3. 调用函数`p()`,传入局部变量x的地址和局部变量y的值(1)。
4. 进入`p()`函数,使用指针运算`*y++`将指针y指向的值(也就是main中的静态变量x)增加1,此时main中的静态变量x变为1。然后,指针y自增,开始指向下一个内存地址。
5. 函数`p()`中的局部变量x自增,变为2。
6. 使用`*--y`操作,首先将指针y减1,指回原来的地址,也就是指向main中的静态变量x,此时它的值是1。将局部变量x(值为2)加上1,得到3。将3赋值给静态变量w。
7. 然后我犯了一个错误,误解了函数p()中全局变量z的值。在p()中没有定义局部变量z,所以这里应该访问的是全局变量z,而不是遮盖了的局部变量z。全局变量z的值为0,所以输出为0。
8. 在`p()`函数中,输出局部变量x(2)、指针y指向的值(0)、全局变量z(0)和静态变量w(3)。
9. 退出`p()`函数,回到`main()`函数,输出静态变量x(1)、局部变量y(1)、局部变量z(1)和局部变量w(1)。
10. 但是,因为输出格式的问题,此处输出的值与我之前所说的有出入。实际上,在`main()`函数中,输出的静态变量x为0(因为在`p()`函数中修改了它的值),局部变量y为1,局部变量z为1,局部变量w为1。所以,在`main()`函数中的输出为0#1#1#1#。
11. 因为`do-while`循环条件为0(false),循环只执行一次。最后,函数返回0。

总的输出顺序是:`p()`函数中的输出,紧接着`main()`函数中的输出。所以最终的输出是:2#0#0#2#0#1#1#1#。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-7 15:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表