c++ - 指针操作导致 printf 以相反的顺序打印参数?

标签 c++ pointers printf

<分区>

这是从虚拟机实验中删除的一小段代码。 它应该从字节缓冲区中压入和弹出 double 。 然而,它显示了一些非常有趣的行为……具体来说,它以某种方式使 printf 以相反的顺序打印其参数,至少在使用 MinGW g++ 4.8.1 编译时是这样。 这是怎么回事? O_o

#include <stdio.h>

#define STACK_BYTES (1024 * 1024 * 2)

struct VM {
    uint8_t* stack;
    uint8_t* sp;

    VM()
    {
        stack = new uint8_t[STACK_BYTES];
        sp = stack;
    }

    ~VM()
    {
        delete[] stack;
    }

    void pushv(double val)
    {
        *(double*)sp = val;
        sp += sizeof(double);
    }

    double popv()
    {
        sp -= sizeof(double);
        return *(double*)sp;
    }
};

int main()
{   
    VM vm;

    vm.pushv(666.f);
    vm.pushv(777.f);
    vm.pushv(888.f);

    printf("%f ", vm.popv());
    printf("%f ", vm.popv());
    printf("%f\n", vm.popv()); // 888.000 777.000 666.000, as expected.

    printf("SP: %d\n", (int)(vm.sp - vm.stack)); // SP: 0, as expected.

    vm.pushv(666.f);
    vm.pushv(777.f);
    vm.pushv(888.f);

    printf("%f %f %f\n", vm.popv(), vm.popv(), vm.popv()); // 666.000 777.000 888.000???

    return 0;
}

最佳答案

该标准未指定任何评估参数的顺序。您的代码未指定:

printf("%f %f %f\n", vm.popv(), vm.popv(), vm.popv());

可能在不同的编译器实现中有不同的结果。你的第一个版本更好。

关于c++ - 指针操作导致 printf 以相反的顺序打印参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23582042/

相关文章:

c++ - 向后读取文件的适当 madvise 设置是什么?

c - 字符串的 Printf 不情愿地下降一行

c - 为什么c语言中 printf ("%d","") 的输出是173?

c++ - Makefile:编译和链接后未删除对象

c++ - 定义矩阵结构的内存分配

c - 如何将 int 的地址转换为 C 中的 char 指针?

C函数中的指针赋值

C++ std::shared_ptr 通过 operator= 赋值

c - 如何帮助程序员在 C 中编写安全和正确的 printf 调用?

c++ - 允许嵌套逻辑 && 运算符吗?