很难理解这个循环

时间:2018-05-28 13:50:27

标签: 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;
}

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

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

2 个答案:

答案 0 :(得分: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      

答案 1 :(得分:0)

运行此命令以了解发生的情况:

#include <iostream>
using namespace std;
char txt[] = "ETERNITTPLATENE-OG-TAKPAPPEN-BLE-KASTET";
int length = strlen(txt);//

void show_position(char* t1, char* t2)//
    {
    for (int i = 0; i < length; i++)
        {
        if (t1 - txt == i)
            {
            if (t2 - txt == i)
                {cout << 'X';}
            cout << '1';
            }
        else if (t2 - txt == i)
            {cout << '2';}
        else
            {cout << '-';}
        }
    cout << endl;
    }

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

int main() {
    cout << txt << endl;//
    funk(txt, txt + 27, 3);
    return 0;
    }

后跟//和函数声明的行仅用于绘图,其余的是您几乎未触及的代码。

一些昵称/建议(我在你的代码中改了):

1)使用cout << endl;代替cout << "\n";。 endl是标准的,因此它可以在任何平台上正常工作(windows,linux,mac - 这是linux,但使用不同的换行符)。许多应用程序甚至在没有正式使用它们的平台上支持\ n默认(例如notepad ++支持windows上的linux换行标准),但这不是不使用endl的好理由。

2)如果你有一个功能,其目的是打印一些显然需要换行的东西,为什么你在调用后放置换行符而不是直接将它放在你的打印功能中?