#include <iostream>
using namespace std;
int main()
{
char str[] {"TESTING"};
char *p {str};
cout << (p++, *++p);
cout << *p++;
cout << p;
return 0;
}
它返回&#34; SSTING&#34;
我知道也许这篇文章并不完全适用于stackoverflow,但我无法弄清楚它的作用,也无法找到任何关于它的文档
cout << (p++, *++p);
我第一次在cout中看到带逗号的圆括号......它们的功能是什么?
并且不应该单独说这句话&#34; TESTING&#34;但似乎只说TING
cout << p;
谢谢!
答案 0 :(得分:2)
让我们一行一行:
char str[] {"TESTING"};
这一行定义了一个名为str
的变量,其类型为 8个字符的数组,并使用字符TESTING
加上一个NUL字符来初始化它以标记结尾。
char *p {str};
这个定义一个名为p
的变量,类型为指向char 的指针,并将其初始化为数组str
的第一个字符的地址(第一个{{1} }})。发生这种情况是因为在大多数情况下,数组会自动衰减为指针。
T
这一行做了几件事。 cout << (p++, *++p);
运算符首先计算左侧运算符,
,该指针递增指针,现在指向p++
;然后它评估右侧运算符E
,但这是一个预增量运算符,因此它再次递增指针(它指向*++p
)。最后,S
运算符访问*
指向的内存,结果为p
。并且该字符被打印到STDOUT。
S
这个很容易。 cout << *p++;
运算符访问*
指向的char(再次p
)并将其打印在STDOUT中。然后它递增指针,因为它是一个后增量运算符。现在它指向第二个S
。
T
至少,此行打印cout << p;
指向的字符串,直到找到NUL字符。由于p
指向数组的第二个p
,因此会打印T
。
将所有这些输出放在一起,即可获得TING
。
答案 1 :(得分:1)
不完全是答案,而是代码所做的细分,
#include <iostream>
using namespace std;
int main()
{
char str[]{"TESTING"};
char *p{str}; // p points to: 'T'
p++; // p points to: 'E'
++p; // p points to: 'S'
cout << *p; // output a single char: 'S'
cout << *p; // ouptut a single char: 'S'
p++; // p points to: 'T'
cout << p; // output a (char *) type pointer, AKA a C-string, "TING";
return 0;
}