我想问一下在这个程序里且和非的用法
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;
}
对呀,当输入不是'Y'又不是'N'的时候一直读入。 lhgzbxhz 发表于 2021-10-24 14:18
对呀,当输入不是'Y'又不是'N'的时候一直读入。
我主要还是想问且和或的用法 GTJoker 发表于 2021-10-24 14:28
我主要还是想问且和或的用法
并,顾名思义,前后条件都是真,整个表达式才是真
或,同理,前后随便哪个是真,整个表达式都是真 直接把具体的值带入进去,就好理解了:
(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]