我在解决老师给我的问题时遇到了一点障碍。 我应该给出以下代码的输出:(它是用 Turbo C++ 编写的)
#include<iostream.h>
void main()
{
char *p = "School";
char c;
c=++(*(p++));
cout<<c<<","<<p<<endl;
cout<<p<<","<<++(*(p--))<<","<<++(*(p++))<<endl;
}
程序给出的输出是:
T,chool
ijool,j,i
我得到了指针自身递增然后递增指针指向的值的部分。但我不明白字符串打印出 ijool
的部分有人可以帮帮我吗?
最佳答案
您展示的程序是非标准且格式错误的(不应编译)。
“小”问题:
- C++ 中输入/输出流的正确 header 是
<iostream>
, 不是<iostream.h>
-
main()
返回int
, 不是void
. -
cout
和endl
不能在没有using namespace std;
的情况下使用在文件的开头,或者更好:使用std::cout
和std::endl
.
“核心”问题:
-
char* p = "School";
是指向字符串文字的指针。此转换在 C++03 中有效,在 C++11 中弃用。除此之外,通常字符串文字是只读的,并且尝试修改它们通常会导致段错误(并且修改字符串文字是标准未定义的行为)。所以,你每次使用p
时都有未定义的行为。 ,因为你修改了它指向的内容,也就是字符串乱码。 - 更微妙(和实际解释):你正在修改
p
多次在线std::cout<<p<<","<<++(*(p--))<<","<<++(*(p++))<<std::endl;
.这是未定义的行为。用于p
操作的顺序没有定义,这里编译器似乎是从右边开始的。可以看到sequence points, sequence before/after以获得更好的解释。
您可能对 live code here 感兴趣,这更像是您对程序的期望。
关于c++ - 指针递增和递减,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15416416/