Chulainn 发表于 2019-3-7 18:00:12

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

各位鱼油好:
我想实现的是当输入一个负数,啥都不做。
当输入一个正数的时候,从这个正数本身开始打印,让它递减一,直到变成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;
}

ZERODIGDARK 发表于 2019-3-7 18:09:42

直接if(n>0)不好吗,现在脑子里一直想怎么写更少更好。。

Chulainn 发表于 2019-3-7 18:21:43

ZERODIGDARK 发表于 2019-3-7 18:09
直接if(n>0)不好吗,现在脑子里一直想怎么写更少更好。。

是,确实是,那样我也理解。现在这么一小段代码无法运行,我想知道深层次原因,或许有我不知道的知识点。看咋改,可以运行出来

润木 发表于 2019-3-7 18:25:22

我复制你的程序放在devc++里面,运行测试都没什么问题

jackz007 发表于 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                     ;
                }
      }
}

Chulainn 发表于 2019-3-7 18:42:17

润木 发表于 2019-3-7 18:25
我复制你的程序放在devc++里面,运行测试都没什么问题

啊我晕!我又运行了一次,出现大黑框控制台后过了差不多10秒才出现“please input an integer”,我自己测试的时候没有等这么长时间,我还以为是代码写错了不能运行呢哈哈哈!谢谢鱼油

Chulainn 发表于 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.

jackz007 发表于 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                     ;
      }
}

Chulainn 发表于 2019-3-9 12:21:26

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

谢谢你的指点。哈哈你没有孤陋寡闻啊,大家有交流才有提高嘛,倒是因为我脑回路比较清奇才想出那样的代码哈哈
页: [1]
查看完整版本: 一个不是很难的循环问题,貌似牵涉到变量作用域的额问题