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

时间:2015-09-15 17:06:09

标签: c pointers post-increment

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

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

4 个答案:

答案 0 :(得分:1)

在您的代码中

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

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

答案 1 :(得分:1)

  

为什么循环显示A两次而不是一次?

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

答案 2 :(得分:1)

它打印67因为(a)您使用的是%d十进制数字输出格式,而(b),在循环结束后,*s == 'C'*t == '\0',它们的ASCII值之差为67

答案 3 :(得分:0)

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