鱼C论坛

 找回密码
 立即注册
查看: 2152|回复: 8

[已解决]一个不是很难的循环问题,貌似牵涉到变量作用域的额问题

[复制链接]
发表于 2019-3-7 18:00:12 | 显示全部楼层 |阅读模式

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

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

x
各位鱼油好:
我想实现的是当输入一个负数,啥都不做。
当输入一个正数的时候,从这个正数本身开始打印,让它递减一,直到变成0。
编译是通过了,但是无法运行。
我猜测是作用域的问题:switch语句对n进行判断,结果又在switch语句中对n进行操作。希望得到鱼油更权威的解答,谢谢亲。
代码:
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. int main(void)
  4. {
  5.     int n;

  6.     printf("please input an integer :");   scanf("%d",&n);

  7.    switch(n >= 0)
  8.     {
  9.         case 0 : printf("error");   break;
  10.         case 1 : {do{printf("%3d",n);
  11.                               n--;
  12.                               }while(n >= 0);
  13.                        }
  14.                        break;
  15.     }

  16.     return 0;
  17. }
复制代码

最佳答案
2019-3-7 18:32:05
本帖最后由 jackz007 于 2019-3-7 18:37 编辑

     不是变量作用域的问题,而是 switch() ... case 语句的用法和逻辑粗了问题
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. int main(void)
  4. {
  5.         int n                                     ;

  6.         printf("please input an integer :")       ;
  7.         scanf("%d" , & n)                         ;
  8.         if(n >= 0) {                                // 原语句 switch(n >= 0) 用法错误,判断 n 值应该添加 if 条件判断
  9.                 switch(n) {                         // 原语句 switch(n >= 0) 用法错误
  10.                 case 0 :
  11.                         printf("error")           ;
  12.                         break                     ;
  13.                 default :                           // 原语句 case 1 : 不符合楼主意图
  14.                         do {
  15.                                 printf("%3d" , n) ;
  16.                                 n --              ;
  17.                         } while(n >= 0)           ;
  18.                         break                     ;
  19.                 }
  20.         }
  21. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-3-7 18:09:42 From FishC Mobile | 显示全部楼层
直接if(n>0)不好吗,现在脑子里一直想怎么写更少更好。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-3-7 18:21:43 | 显示全部楼层
ZERODIGDARK 发表于 2019-3-7 18:09
直接if(n>0)不好吗,现在脑子里一直想怎么写更少更好。。

是,确实是,那样我也理解。现在这么一小段代码无法运行,我想知道深层次原因,或许有我不知道的知识点。看咋改,可以运行出来
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-7 18:25:22 | 显示全部楼层
我复制你的程序放在devc++里面,运行测试都没什么问题
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-7 18:32:05 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2019-3-7 18:37 编辑

     不是变量作用域的问题,而是 switch() ... case 语句的用法和逻辑粗了问题
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. int main(void)
  4. {
  5.         int n                                     ;

  6.         printf("please input an integer :")       ;
  7.         scanf("%d" , & n)                         ;
  8.         if(n >= 0) {                                // 原语句 switch(n >= 0) 用法错误,判断 n 值应该添加 if 条件判断
  9.                 switch(n) {                         // 原语句 switch(n >= 0) 用法错误
  10.                 case 0 :
  11.                         printf("error")           ;
  12.                         break                     ;
  13.                 default :                           // 原语句 case 1 : 不符合楼主意图
  14.                         do {
  15.                                 printf("%3d" , n) ;
  16.                                 n --              ;
  17.                         } while(n >= 0)           ;
  18.                         break                     ;
  19.                 }
  20.         }
  21. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-3-7 18:42:17 | 显示全部楼层
润木 发表于 2019-3-7 18:25
我复制你的程序放在devc++里面,运行测试都没什么问题

啊我晕!我又运行了一次,出现大黑框控制台后过了差不多10秒才出现“please input an integer”,我自己测试的时候没有等这么长时间,我还以为是代码写错了不能运行呢哈哈哈!谢谢鱼油
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-3-7 18:47:06 | 显示全部楼层
jackz007 发表于 2019-3-7 18:32
不是变量作用域的问题,而是 switch() ... case 语句的用法和逻辑粗了问题

这位鱼油,谢谢你哦,不过我的代码也是没错的,我听你上面一位鱼油说是可以运行成功的,这么我耐心地等,结果也运行成功了哈哈。
你说的也不对,我switch的用法是没错的,我在看《明解C语言》入门篇,75页有这样一句话:“对左右操作数的大小关系进行判断的是关系运算符< ,> ,<= ,>= ”,无论是哪一个,当判断成立时结果都为int类型的1,否则为了。
就以这一小段代码为例,当n确实 >= 0时,(n >= 0)返回的值是int 型的1.
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-7 22:21:21 | 显示全部楼层
本帖最后由 jackz007 于 2019-3-8 10:17 编辑
Chulainn 发表于 2019-3-7 18:47
这位鱼油,谢谢你哦,不过我的代码也是没错的,我听你上面一位鱼油说是可以运行成功的,这么我耐心地等, ...


      楼主,不好意思,是我孤陋寡闻,switch(n >=0) 这种用法确实是可以的,只不过不是很常见。n >= 0 是个布尔表达式,其取值为 true 和 false。在你的代码中,用 0 代表了 false,这个应该没有问题,但是,用 1 来代表 true 就值得商榷了,道理很简单,1 一定是 true,但是,true 并不一定就是 1,因为所有非零值都可以代表这个逻辑值,所以,为了严谨,对你的代码略作修改如下:
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. int main(void)
  4. {
  5.         int n                               ;

  6.         printf("please input an integer :") ;
  7.         scanf("%d" , & n)                   ;

  8.         switch(n >= 0) {
  9.         case false :                          // 由 case 0: 修改而来
  10.                 printf("error\n")           ;
  11.                 break                       ;
  12.         case true  :                          // 由 case 1: 修改而来
  13.                 do {
  14.                         printf("%3d" , n)   ;
  15.                         n --                ;
  16.                 } while(n >= 0)             ;
  17.                 printf("\n")                ; // 添加回车换行语句
  18.                 break                       ;
  19.         }
  20. }
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-3-9 12:21:26 | 显示全部楼层
jackz007 发表于 2019-3-7 22:21
楼主,不好意思,是我孤陋寡闻,switch(n >=0) 这种用法确实是可以的,只不过不是很常见。n >= 0 ...

谢谢你的指点。哈哈你没有孤陋寡闻啊,大家有交流才有提高嘛,倒是因为我脑回路比较清奇才想出那样的代码哈哈
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-3 17:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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