鱼C论坛

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

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

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

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

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

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

int main(void)
{
    int n;

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

   switch(n >= 0)
    {
        case 0 : printf("error");   break;
        case 1 : {do{printf("%3d",n);
                              n--;
                              }while(n >= 0);
                       }
                       break;
    }

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

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

int main(void)
{
        int n                                     ;

        printf("please input an integer :")       ;
        scanf("%d" , & n)                         ;
        if(n >= 0) {                                // 原语句 switch(n >= 0) 用法错误,判断 n 值应该添加 if 条件判断 
                switch(n) {                         // 原语句 switch(n >= 0) 用法错误 
                case 0 : 
                        printf("error")           ;
                        break                     ;
                default :                           // 原语句 case 1 : 不符合楼主意图
                        do {
                                printf("%3d" , n) ;
                                n --              ;
                        } while(n >= 0)           ;
                        break                     ;
                }
        }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

使用道具 举报

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

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

使用道具 举报

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

使用道具 举报

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

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

int main(void)
{
        int n                                     ;

        printf("please input an integer :")       ;
        scanf("%d" , & n)                         ;
        if(n >= 0) {                                // 原语句 switch(n >= 0) 用法错误,判断 n 值应该添加 if 条件判断 
                switch(n) {                         // 原语句 switch(n >= 0) 用法错误 
                case 0 : 
                        printf("error")           ;
                        break                     ;
                default :                           // 原语句 case 1 : 不符合楼主意图
                        do {
                                printf("%3d" , n) ;
                                n --              ;
                        } while(n >= 0)           ;
                        break                     ;
                }
        }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

啊我晕!我又运行了一次,出现大黑框控制台后过了差不多10秒才出现“please input an integer”,我自己测试的时候没有等这么长时间,我还以为是代码写错了不能运行呢哈哈哈!谢谢鱼油
想知道小甲鱼最近在做啥?请访问 -> 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.
想知道小甲鱼最近在做啥?请访问 -> 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,因为所有非零值都可以代表这个逻辑值,所以,为了严谨,对你的代码略作修改如下:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
        int n                               ;

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

        switch(n >= 0) {
        case false :                          // 由 case 0: 修改而来
                printf("error\n")           ;
                break                       ;
        case true  :                          // 由 case 1: 修改而来
                do {
                        printf("%3d" , n)   ;
                        n --                ;
                } while(n >= 0)             ;
                printf("\n")                ; // 添加回车换行语句
                break                       ;
        }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

谢谢你的指点。哈哈你没有孤陋寡闻啊,大家有交流才有提高嘛,倒是因为我脑回路比较清奇才想出那样的代码哈哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-3 10:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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