为什么while循环中'*s-*t'的结果是'67'?

why the result of '*s-*t" in the while loop is "67"?

我无法理解 while 循环,为什么循环显示 A 两次而不是一次

char *s,*t;
s="ABC";
t="AA";
do {printf("A");}
while(*s++==*t++);
printf("%d %d",*s-*t);

在你的代码中

printf("%d %d",*s-*t);

调用未定义的行为,因为您没有提供足够的参数来满足提供的格式说明符。

why the loop show A two time and not one?

do 后第一次无条件打印。然后测试发生,条件为真 (A == A)。所以循环再次开始,第二次打印 A 。之后再次进行测试,条件为假(D != A),所以循环终止。

它打印 67 因为 (a) 您正在使用 %d 十进制数输出格式,并且 (b) 在循环结束后, *s == 'C'*t == '[=13= ]',它们的ASCII值之差为67.

do...while 循环总是至少运行一次。所以在第一次迭代中, A 被打印出来。在条件中 s 指向其字符串中的第一个字符(A),而 t 指向其字符串中的第一个字符(也就是 A)。所以它比较 ('A'=='A') 哪个为真,然后 st 都递增以指向每个字符串中的第二个字符(分别为 AB) .

在第二次迭代中,另一个 A 被打印出来。在比较 ('B'=='A') 为假的条件下,st 都会递增以指向每个字符串中的第三个字符。由于t字符串只包含两个字符,t实际上指向字符串末尾的NULL字节。

printf中,它将sC)指向的值减去t指向的值(一个NULL字节,在您的实现是 0)。 C的ASCII值为6767 - 0 = 0,所以打印出67