指针递增和递减

Ort*_*dex 0 c++ pointers turbo-c++

我正在解决老师给我的一个问题并且遇到了一些问题.我应该给出以下代码的输出:(用Turbo C++编写)

#include<iostream.h>
void main()
{
    char *p = "School";
    char c;
    c=++(*(p++));
    cout<<c<<","<<p<<endl;
    cout<<p<<","<<++(*(p--))<<","<<++(*(p++))<<endl;

}
Run Code Online (Sandbox Code Playgroud)

程序给出的输出是:

T,chool
ijool,j,i
Run Code Online (Sandbox Code Playgroud)

我得到了指针本身增量的部分,然后递增指针指向.但我没有得到字符串打印出来的部分ijool

有人可以帮我吗?

Syn*_*xis 5

你展示的程序是非标准的和不正确的(不应该编译).

"小"问题:

  • C++中输入/输出流的正确标头<iostream>不是<iostream.h>
  • main()返回一个int,而不是一个void.
  • cout并且endl不能在没有using namespace std;文件开头的情况下使用,或者更好:使用std::coutstd::endl.

"核心"问题:

  • char* p = "School";是指向字符串litteral的指针.此转换在C++ 03中有效,在C++ 11中已弃用.除此之外,通常字符串litterals是只读的,并且尝试修改它们通常会导致段错误(并且修改字符串litteral是标准的未定义的行为).因此,每次使用时都会有未定义的行为p,因为您修改了它指向的内容,即字符串litteral.
  • 更微妙(和实际解释):你在线上修改p了几次std::cout<<p<<","<<++(*(p--))<<","<<++(*(p++))<<std::endl;.这是未定义的行为.p没有定义用于操作的顺序,这里似乎编译器从右边开始.您可以查看序列点,序列之前/之后的序列以获得更好的解释.

您可能对此处实时代码感兴趣,这更像您对程序的期望.