1

假设 ncurses 标头在那里并且我的random_number_generator()方法有效。我试图通过点击“a”退出循环(最终我想通过点击退出CtrlE)。

我的代码继续按预期每秒打印随机数。如果满足任一条件,我希望它退出:

  1. 如果随机数是除数的倍数,它将退出。

  2. 如果我使用它将退出getch()。我认为这应该可以,但是当我点击它时它并没有退出a

    int main(int argc, char *argv[]){
      int lowest = atoi(argv[1]);
      int highest = atoi(argv[2]);
      int divisor = atoi(argv[3]);
    
      int random_number;
      srand((unsigned)time(0));
    
      int c;
      do
      {
        random_number = random_number_generator(lowest, highest);
        cout << random_number << endl;
        sleep(1);
      } while(random_number % divisor != 0 || (c=getch())!=49);
    
      return 0;
    }
    

编辑:

我尝试将条件更改为 && 但 getch 仍然不让它退出:

随机数输出范围 1-10:

4
a3    <-hit a
aaa4  <-hit a many times
5     <-exits
4

8 回答 8

2

因为如果第一个表达式为真第二个不执行,逻辑或运算符的短路行为。||

    random_number % divisor != 0  ||  (c=getch())!=49
 // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^      ^
       True                           not get executes       
于 2013-09-05T05:42:46.583 回答
0

更改您的操作|| to && 并进行c=getch()!=49第一次控制。您可以在下面看到示例;

int lowest = atoi(argv[1]);
int highest = atoi(argv[2]);
int divisor = atoi(argv[3]);

int random_number;
srand((unsigned)time(0));

int c;
do
{
    random_number = random_number_generator(lowest, highest);
    cout << random_number << endl;
    sleep(1);
} while((c=getch())!=49 && random_number % divisor != 0);

return 0;
于 2013-09-05T06:08:05.050 回答
0

因为在任何给定的输入上至少满足条件并且 or(||) 继续循环。使用 and(&&) 代替。

于 2013-09-05T05:47:51.253 回答
0
char c;
    do
        {
            random_number = random_number_generator(lowest, highest);
            cout << random_number << endl;

            if(random_number % divisor == 0)
            break;
            else if((c=getchar())=='a')
            break;
            else;

            sleep(1);

        } while(1);
于 2013-09-05T06:09:25.273 回答
0
#include <stdio.h>
#include <conio.h> 

int main(int argc, char *argv[])
{
  int lowest = atoi(argv[1]);
  int highest = atoi(argv[2]);
  int divisor = atoi(argv[3]);

  int random_number;
  srand((unsigned)time(0));

  char c;
  do
  {
    random_number = random_number_generator(lowest, highest);
    printf("%d\n",random_number);
     if(random_number % divisor == 0)
     break;
     else if(kbhit()){
            c = getch();
            if(c=='a')
            break;
     }
     else;
    sleep(1);
  } while(1);

  return 0;
}
于 2013-09-05T06:54:47.983 回答
0

因为random_number % divisor != 0是真的,所以它不在乎你输入什么

&&改为使用

于 2013-09-05T05:39:17.790 回答
0

每当您使用条件时,请确保所有部分都按预期运行。

为了更清楚,您应该更好地使用:

do
    {
        random_number = random_number_generator(lowest, highest);
        cout << random_number << endl;
        sleep(1);
    } while(random_number % divisor != 0 && (c=getch())!='a');

现在,如果您输入“a”,则第二个条件为假,循环终止。

于 2013-09-05T05:43:45.713 回答
0

您的 while 循环有一个带有两个条件的 OR 运算符 (||),在这种情况下,评估是从左到右执行的。条件可以为真有两种情况,一种是如果 random_number % divisor == 0 ,另一种是 c=getch() == 49 ,如果其中任何一个条件为真,则循环将终止,否则将执行它的下一次迭代。

由于条件评估是从左到右进行的,所以如果 while() 中的第一个条件为真,则进行下一次迭代,所以每当 random_number % divisor == 0 时,就会进行下一次迭代。

解决方法:把c=getch() != 49放在左边,把它作为第一个条件,把random_number % divisor !=0放在右边,从左到右把它作为第二个条件。

于 2013-09-05T05:45:45.283 回答