c++ - 指针递增和递减

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

}

程序给出的输出是:

T,chool
ijool,j,i

我得到了指针自身递增然后递增指针指向的的部分。但我不明白字符串打印出 ijool

的部分

有人可以帮帮我吗?

最佳答案

您展示的程序是非标准且格式错误的(不应编译)。

“小”问题:

  • C++ 中输入/输出流的正确 header 是 <iostream> , 不是 <iostream.h>
  • main()返回 int , 不是 void .
  • coutendl不能在没有 using namespace std; 的情况下使用在文件的开头,或者更好:使用 std::coutstd::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/

相关文章:

c++ - Microsoft DirectX SDK 安装失败,错误代码为 S1018

c++ - 为库输入参数的正确方法

c++ - 如何创建一个结构体来存储和返回 float 组?

c - Turbo C++ 链接器警告 : No module definition specified

c++ - NULL 指针赋值错误

c++ - std::ranges::elements_view 用于自定义元组数据

c++ - 如何处理运行时在对象上定义的不同操作

c - NULL 指针的特定值

c - 从类型指针到类型数组指针的转换是否安全?

c++ - 将非静态方法传递给泛型函数