很难理解这个循环

Me *_*d I 0 c++ loops while-loop

我在循环时遇到一些麻烦,它的结果是"TT",但对我来说,如果它打印出"TP"是有意义的.谁能帮我吗?我将展示为什么我认为它应该打印"TP",并需要解释为什么它打印"TT"(这是正确的).

#include <iostream>
using namespace std;
char txt[] = "ETERNITTPLATENE-OG-TAKPAPPEN-BLE-KASTET";

void funk(char* t1, char* t2, int n)
{
    while (t1 < t2) { ++t1; t2 -= n; } cout << *t1 << *t2;
}

int main() {
    funk(txt, txt + 27, 3); cout << '\n';
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

所以它第一次运行func(E,N,3)所以我们得到 E < N哪个是真的,因此它使得E到T和N到P(因为27-3是24,并且在那个数组中P是24).

那么我们得到T < P,这是假的,因此它应该停止while循环和显示TP,它不会.我在想什么?

Shu*_*ham 8

当你这样做时,t1 < t2你不是在比较(*t1) < (*t2)哪个意味着比较'T' < 'P'.

相反,它正在比较存储字符'T''P'存储的内存地址的值.在这种情况下,'T'之前存储'P'.

我已经包含了指针在整个循环中的移动方式.这应该澄清while循环的整个迭代.

E  T  E  R  N  I  T  T  P  L  A  T  E  N  E  -  O  G  -  T  A  K  P  A  P  P  E  N
0  1  2  3  4  5  6  7  8  9  10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
^                                                                                ^
t1                                                                               t2

E  T  E  R  N  I  T  T  P  L  A  T  E  N  E  -  O  G  -  T  A  K  P  A  P  P  E  N
0  1  2  3  4  5  6  7  8  9  10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
   ^                                                                    ^
   t1                                                                   t2

E  T  E  R  N  I  T  T  P  L  A  T  E  N  E  -  O  G  -  T  A  K  P  A  P  P  E  N
0  1  2  3  4  5  6  7  8  9  10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
      ^                                                        ^
      t1                                                       t2

E  T  E  R  N  I  T  T  P  L  A  T  E  N  E  -  O  G  -  T  A  K  P  A  P  P  E  N
0  1  2  3  4  5  6  7  8  9  10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
         ^                                            ^
         t1                                           t2

E  T  E  R  N  I  T  T  P  L  A  T  E  N  E  -  O  G  -  T  A  K  P  A  P  P  E  N
0  1  2  3  4  5  6  7  8  9  10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
            ^                                ^
            t1                               t2

E  T  E  R  N  I  T  T  P  L  A  T  E  N  E  -  O  G  -  T  A  K  P  A  P  P  E  N
0  1  2  3  4  5  6  7  8  9  10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
               ^                    ^
               t1                   t2

E  T  E  R  N  I  T  T  P  L  A  T  E  N  E  -  O  G  -  T  A  K  P  A  P  P  E  N
0  1  2  3  4  5  6  7  8  9  10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
                  ^        ^
                  t1       t2

E  T  E  R  N  I  T  T  P  L  A  T  E  N  E  -  O  G  -  T  A  K  P  A  P  P  E  N
0  1  2  3  4  5  6  7  8  9  10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
                  ^  ^
                  t2 t1      
Run Code Online (Sandbox Code Playgroud)