小白重新学C语言。 准备把K&R的The C programming language从头到尾学一遍。 然后今天敲到getchar()时,为了做练习1-6:验证getchar()!=EOF 是0还是1,我就写了下面的代码: main() { int thischar,test=0; char flag = 0; while ((thischar=getchar()) != EOF) { test = ((thischar = getchar()) != EOF); //Q1. printf("The value of condition after putchar(): %d \n", test); flag = 1; //if ((thischar = getchar()) != EOF); //test step while ((thischar = getchar()) != EOF && flag == 1) { putchar(thischar); //printf("\n"); } flag = 0; } 输入“12345678”,输入就是“345678”。 缺少“12”。 我打开调试之后,发现thischar的值是这样变化的: 我查了ASCII码,对应的49,50就是1和2. 也就是说因为我多检测了两次 (thischar = getchar()) != EOF 这个。就导致我输出少了两个字符。我之后又试了试,以此类推,条件数量增多少,输出的字符就会少多少。 网上说getchar()函数的代码是这样的: int getchar () { int result; _IO_acquire_lock (_IO_stdin); result = _IO_getc_unlocked (_IO_stdin); _IO_release_lock (_IO_stdin); return result; } 我也查了寄存器的说明,但是还是不明白,为什么会造成这样的情况。和getchar()这个函数的定义有关系吗?如果没有,那是哪里出的问题呢? 感激不尽! 追加: 谁能大概解释一下getchar()函数定义,用自然语言描述大概是什么样的过程? 以及: while ((thischar=getchar()) != EOF) 01064C89 mov esi,esp 01064C8B call dword ptr [__imp__getchar (0106916Ch)] 01064C91 cmp esi,esp 01064C93 call __RTC_CheckEsp (01061113h) 01064C98 mov dword ptr [thischar],eax 01064C9B cmp dword ptr [thischar],0FFFFFFFFh 01064C9F je main+0D3h (01064D33h) { test = ((thischar = getchar()) != EOF); //Q1. 01064CA5 mov esi,esp 01064CA7 call dword ptr [__imp__getchar (0106916Ch)] 01064CAD cmp esi,esp 01064CAF call __RTC_CheckEsp (01061113h) 01064CB4 mov dword ptr [thischar],eax 01064CB7 cmp dword ptr [thischar],0FFFFFFFFh 01064CBB je main+69h (01064CC9h) 01064CBD mov dword ptr [ebp-0E8h],1 01064CC7 jmp main+73h (01064CD3h) 01064CC9 mov dword ptr [ebp-0E8h],0 01064CD3 mov eax,dword ptr [ebp-0E8h] 01064CD9 mov dword ptr [test],eax 上面的EAX寄存器应该是存了getchar()的返回值,那后面这个值是怎么样被后续操作抹掉的?我不太懂。