|  | 
 
| 
do
x
马上注册,结交更多好友,享用更多功能^_^您需要 登录 才可以下载或查看,没有账号?立即注册  {
 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;
 }
 
 
直接把具体的值带入进去,就好理解了:
 (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循环中 。
 | 
 |