GTJoker 发表于 2021-10-24 14:00:25

我想问一下在这个程序里且和非的用法

        do
      {
            ch = getchar();//这句话的意思是从键盘输入不是Y和N,就一直运行这段循环的意思吗?
      }while(ch != 'Y' && ch != 'N');//这里为什么用&&,而不是||。网上查了一下,&&要两个都对才是对,但是从键盘输入Y和N只输入其中一个就往下运行了,为什么不是||,输入其中一个是对的然后往下运行?


下面是程序代码
#include <stdio.h>

#define MAX_SIZE 100

struct Book
{
    char title;
    char author;
    float price;
};

void getInput(struct Book *book)
{
    printf("请输入书名:");
    scanf("%s",book -> title);
    printf("请输入作者:");
    scanf("%s",book -> author);
    printf("请输入价格:");
    scanf("%f",&book -> price);
}

void printBook(struct Book *book)
{
    printf("书名是:%s\n",book -> title);
    printf("作者是:%s\n",book -> author);
    printf("价格是:%.2f\n",book -> price);

}

void initLibrary(struct Book *library[])
{
    int i;

    for(i = 0;i < MAX_SIZE;i++)
    {
      library = NULL;
    }
}

void printLibrary(struct Book *library[])
{
    int i;

    for(i = 0;i < MAX_SIZE;i++)
    {
      if(library != NULL)
      {
            printBook(library);
      }
    }
}

void releaseLibrary(struct Book *library[])
{
    int i;

    for(i = 0;i < MAX_SIZE;i++)
    {
      if(library != NULL)
      {
            free(library);
      }
    }
}

int main(void)
{
    struct Book *library;
    struct Book *ptr = NULL;
    int ch,count = 0;

    while(1)
    {
      printf("请问是否要录入图书?(Y/N)");
      do
      {
            ch = getchar();//这句话的意思是从键盘输入不是Y和N,就一直运行这段循环的意思吗?
      }while(ch != 'Y' && ch != 'N');//这里为什么用&&,而不是||。网上查了一下,&&要两个都对才是对,但是从键盘输入Y和N只输入其中一个就往下运行了,为什么不是||,输入其中一个是对的然后往下运行?

      if(ch == 'Y')
      {
            if(count < MAX_SIZE)
            {
                ptr = (struct Book *)malloc(sizeof(struct Book));
                getInput(ptr);
                library = ptr;
                count++;
            }
            else
            {
                printf("内存已满,无法录入。。。\n");
                break;
            }
      }
      else
      {
            break;
      }
    }

    printf("录入成功。。。\n");
    printLibrary(library);
    releaseLibrary(library);


    return 0;
}

lhgzbxhz 发表于 2021-10-24 14:18:55

对呀,当输入不是'Y'又不是'N'的时候一直读入。

GTJoker 发表于 2021-10-24 14:28:53

lhgzbxhz 发表于 2021-10-24 14:18
对呀,当输入不是'Y'又不是'N'的时候一直读入。

我主要还是想问且和或的用法

wp231957 发表于 2021-10-24 15:57:48

GTJoker 发表于 2021-10-24 14:28
我主要还是想问且和或的用法

并,顾名思义,前后条件都是真,整个表达式才是真
或,同理,前后随便哪个是真,整个表达式都是真

番杰 发表于 2021-10-25 14:50:31

直接把具体的值带入进去,就好理解了:

(1)假如输入的是 ‘ Y ’,即ch = ‘ Y ’;
进行判断:ch != 'Y',这直接为假,即0;
因为&&在c语言中有短路判断法(好像是这个名字),
其大意就是若 &&左边的表达式进行判断后,结果为假,即立刻给出假的结果,
不会进行&&右边的表达式的判断,在这里就是不会进行ch != 'N'的判断。
所以结果为假,(就是逻辑0),退出循环。

(2)假如输入的是 ‘ N ’,即ch = ‘ N ’;
进行判断:
ch != 'Y',为真,即1;
ch != 'N',为假,即0;
所以相当于1 && 0 :
结果为假,退出循环。

(3)假如输入的是 ‘ F ’,即ch = ‘ F’;(此处代指除‘’Y‘’N' 之外的所有字符)
进行判断:
ch != 'Y',为真,即1;
ch != 'N',为真,即1;
所以相当于1 && 1 :
结果为真,继续循环。

另外,关于此处为什么不能用 ||(或),这个就更好理解了,
while(ch != 'Y' || ch != 'N');
简单的代入一个'Y'即可知道答案:
假如输入‘Y’,即ch = ‘ Y’
ch != 'Y' ,为假。
ch != 'N' ,为真。
所以相当于0 || 1 :
结果为真,继续循环。(输入N,同理)

所以此时使用||,就不能起到输入‘Y’'N',退出循环的作用了,
不论你输入什么,程序都会卡在这个while循环中 。
页: [1]
查看完整版本: 我想问一下在这个程序里且和非的用法