鱼C论坛

 找回密码
 立即注册
查看: 889|回复: 4

[已解决]我想问一下在这个程序里且和非的用法

[复制链接]
发表于 2021-10-24 14:00:25 | 显示全部楼层 |阅读模式

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

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

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


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

#define MAX_SIZE 100

struct Book
{
    char title[128];
    char author[40];
    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[i] = NULL;
    }
}

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

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

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

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

int main(void)
{
    struct Book *library[MAX_SIZE];
    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[count] = ptr;
                count++;
            }
            else
            {
                printf("内存已满,无法录入。。。\n");
                break;
            }
        }
        else
        {
            break;
        }
    }

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


    return 0;
}
最佳答案
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循环中 。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-10-24 14:18:55 | 显示全部楼层
对呀,当输入不是'Y'又不是'N'的时候一直读入。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-24 14:28:53 | 显示全部楼层
lhgzbxhz 发表于 2021-10-24 14:18
对呀,当输入不是'Y'又不是'N'的时候一直读入。

我主要还是想问且和或的用法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-24 15:57:48 From FishC Mobile | 显示全部楼层
GTJoker 发表于 2021-10-24 14:28
我主要还是想问且和或的用法

并,顾名思义,前后条件都是真,整个表达式才是真
或,同理,前后随便哪个是真,整个表达式都是真
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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循环中 。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-22 18:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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