为什么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')
哪个为真,然后 s
和 t
都递增以指向每个字符串中的第二个字符(分别为 A
和 B
) .
在第二次迭代中,另一个 A
被打印出来。在比较 ('B'=='A')
为假的条件下,s
和 t
都会递增以指向每个字符串中的第三个字符。由于t
字符串只包含两个字符,t
实际上指向字符串末尾的NULL字节。
在printf
中,它将s
(C
)指向的值减去t
指向的值(一个NULL字节,在您的实现是 0
)。 C
的ASCII值为67
,67 - 0 = 0
,所以打印出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')
哪个为真,然后 s
和 t
都递增以指向每个字符串中的第二个字符(分别为 A
和 B
) .
在第二次迭代中,另一个 A
被打印出来。在比较 ('B'=='A')
为假的条件下,s
和 t
都会递增以指向每个字符串中的第三个字符。由于t
字符串只包含两个字符,t
实际上指向字符串末尾的NULL字节。
在printf
中,它将s
(C
)指向的值减去t
指向的值(一个NULL字节,在您的实现是 0
)。 C
的ASCII值为67
,67 - 0 = 0
,所以打印出67
。