环境:Visual Studio 2022
语言:C
问题代码如下:
#include <stdio.h>
int main() {
for (int m = 22; m > 0; m--) { //输出tanx函数x轴上半部分的函数
printf("*"); //函数的 y 轴
for (int i = 1; i <= m * m; i = 2 * i) //用2的指数增长来模拟tanx的增长
printf(" ");
printf("*");
for (int k = 0; k < 38; k++)
printf(" ");
for (int i = 1; i <= m * m; i = i * 2)
printf(" "); //用于间隔每个*
printf("*\n");
}
printf("*******************************************************************************************************\n"); //函数的x轴
for (int m = 1; m <= 22; m++) { //输出tanx函数x轴下半部分的函数
printf("*"); //函数的 y 轴
for (int i = 0; i < 20; i++)
printf(" ");
for (int i = 256; i >= m * m; i = i / 2)
printf(" ");
printf("*");
for (int k = 0; k < 48; k++)
printf(" ");
for (int i = 256; i >= m * m; i = i / 2)
printf(" "); //用于间隔每个*
printf("*\n");
}
}
调试运行正常结果如下:
直接运行异常结果如下:
有人知道为什么会出现这种情况吗?
应该是屏幕缓冲区溢出后出现的怪问题。
屏幕缓冲区溢出
感谢!
但是请问为什么调试运行和直接运行显示结果不一样?直接运行的话经常出问题,但是调试运行就不会出问题。
@道成空: 你自己看看,在一个main函数定位两次int m,这样合理吗?建议把m变量定义在函数开头的位置,或全局定义,编译器没给你报错?改了再试试吧
@道成空: 还有其他变量,这样不合理啊
@Wx120: m在for里面定义的话,那它的作用域就是for循环,循环结束就销毁了,所以这样写是没问题的,我刚刚试过,在for循环外定义m也是这个结果。
@Wx120: 我的语法是对的,没有问题
@道成空: 那你在main函数里面加上一个运行一次的条件,或者在最后一个for后面加一个while(1),有可能它默认循环main了
@Wx120: 还是和最后一张图一样,如果它异常运行就不会结束程序,就会卡在那,这个程序我用java跑一点问题没有,可能是编译器问题?
@道成空: 有可能,看效果图很明显x轴打了两次,建议还是规范点,该有的循环都加上,该有的格式都规范下,方便大家看代码
@Wx120: 行,我再改改看
@道成空: 我下班回去也弄下来试试,我用vc++6.0试试
@Wx120: 嗯,感谢!
@道成空: 我试过了,把这串代码直接运行,我这边的编译器会报错,所以我把你在for循环定义的变量放到了开头,然后运行是正常的,可以实现tan函数
@道成空:
@Wx120: 直接运行和调试运行都是对的吗?
@Wx120: 如果这样的话,那应该是编译器的问题。总之,十分感谢!
@道成空: 是的,都是对的
@Wx120: VS的问题实锤,感谢大佬!
@道成空: 共同学习,相互交流罢了