我在理解循环时遇到一些麻烦,它的结果是“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
,但它不会。我在想什么?
答案 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)如果你有一个功能,其目的是打印一些显然需要换行的东西,为什么你在调用后放置换行符而不是直接将它放在你的打印功能中?