你不能使用%d来打印long long 。 你必须使用%lld 。 (因此请使用"\\n%d %d | %lld %lld | %d %d"作为格式字符串。)

特别是,显而易见的是,在“52 0 | 52 0”中,第一个52 0是a.rez ,第二个52 0是b.rez (这些中的每一个都是long long ,显然是(从输出)将两个单词推入堆栈)。 a.tonum不打印a.tonum和b.tonum 。

要理解为什么会发生这种情况,让我解释一下乔纳森和我想说的话。 当你调用像一个可变参数函数printf (被声明为类似printf(const char *format, ...)编译器没有办法来验证正确的参数类型的...在编译时。因此,有在这种情况下决定在堆栈上推送什么的过程,大致可以概括为:如果它是int或可升级到int ,它将被推送为int ;如果它是double或可升级为double ,则它被推送为double ;否则,按原样推送。

在实现像printf这样的可变函数时,您需要一些方法来访问...项目。 这样做的方法是使用在声明的va_list 。 这是一些伪代码,显示它是如何使用的:

int printf(const char *format, ...)

{

va_list ap;

va_start(ap, format);

while (/* we find the next format marker */) {

if (/* %d, %i, %c */) {

int val = va_arg(ap, int);

/* print out val as decimal or (for %c) char */

} else if (/* %u, %x, %X, %o */) {

unsigned int val = va_arg(ap, unsigned int);

/* print out val as decimal, hex, or octal */

} else if (/* %ld, %li */) {

long val = va_arg(ap, long);

/* print out val as decimal */

} else if (/* %lu, %lx, %lX, %lo */) {

unsigned long val = va_arg(ap, unsigned long);

/* print out val as decimal, hex, or octal */

} else if (/* %lld, %lli */) {

long long val = va_arg(ap, long long);

/* print out val as decimal */

} else if (/* %llu, %llx, %llX, %llo */) {

unsigned long long val = va_arg(ap, unsigned long long);

/* print out val as decimal, hex, or octal */

} else if (/* %s */) {

const char *val = va_arg(ap, const char *);

/* print out val as null-terminated string */

} /* other types */

}

va_end(ap);

return /* ... */;

}

请注意,每次要选择...参数时,都要使用va_arg ,并且必须指定要选择的类型。 您可以选择正确的类型。 如果类型不正确,则会出现类型错误,在大多数情况下会出现未定义的行为(意味着程序可以执行任何喜欢的操作,包括崩溃或更糟)。

在您的特定计算机中,似乎当您通过long long ,它将64位数量推送到堆栈,但因为您使用了%d格式说明符,它使用了va_arg(ap, int)版本,它只抓取一个32位的数量。 这意味着64位字的另一半仍然未读,后续%d然后继续读取。 这就是为什么在格式字符串完成时,它永远不会处理你传递的a.tonum和b.tonum的值。

如果您正确使用%lld ,它将使用va_arg(ap, long long) ,并且可以正确读取整个64位数量。

c语言printf %llo,c++ - Printf疯狂了 - 堆栈内存溢出相关推荐

  1. c语言编程无法生成dat文件格式,c++ - 无法从.dat文件读取数据(从Simulink创建的VS2012 C ++项目) - 堆栈内存溢出...

    编辑:谢谢,对那些感兴趣的人的固定代码:ert_main.cpp: #include /* This ert_main.c example uses printf/fflush */ #include ...

  2. c语言kbhit函数头文件,c - 有没有办法替换标准C中的kbhit()和getch()函数? - 堆栈内存溢出...

    我试图获得与控制台交互的快速时间事件类型,并设法使用conio库获得了它. 不幸的是,我正在从事的项目要求代码必须在Windows和Linux上都可以编译,但我想不出一种改变它的方法. 我可以做些什么 ...

  3. c语言lnk1120,c - 致命错误LNK1120:C中1个未解决的外部问题 - 堆栈内存溢出

    通常,当我收到此错误时,创建一个新项目并复制并粘贴该代码修复,但现在没有. 这是输出: 1>------ Build started: Project: myList, Configuratio ...

  4. c语言gcno文件位置,makefile - 具有覆盖率的CMake Ninja将gcno文件放在根二进制目录中 - 堆栈内存溢出...

    我正在使用忍者生成器通过cmake构建一个项目,并使用add_compile_options("$:-g;-O0;-ftest-coverage;-fprofile-arcs;-fno-bu ...

  5. c语言 删除小写字母,c++ - 使用C字符串和指针。 删除除小写字母和空格以外的所有字符 - 堆栈内存溢出...

    当您决定从字符串中删除一个字符时,您可以将剩余的字符向左移动一个位置,这很好,但是无论该字符的实际值如何,都可以在该字符开始移动后的位置跳过该字符是. 这就是为什么您在输出中看到不需要的字符的原因. ...

  6. c语言sort函数排序二维数组,c++ - 如何使用stl sort函数根据第二列对二维数组进行排序? - 堆栈内存溢出...

    stl排序要求迭代器的rvalue作为参数传递. 如果你想使用sort函数,你必须在c ++ 11中编译并使用数组stl来存储数组. 代码如下 #include "bits/stdc++.h ...

  7. c语言来自不兼容指针类型的分配,c - 为什么我会收到“警告:来自不兼容指针类型的分配”? 结构数组中的双链表 - 堆栈内存溢出...

    我正在尝试实现连接到数组的双链表的实现. 构成数组的结构包含列表的Head和Tail指针. typedef struct myStruct{ int code; struct myStruct *He ...

  8. 无限循环当然数c语言,c++ - C / C ++中的无限循环[关闭] - 堆栈内存溢出

    每个人似乎都喜欢while (true) : 根据SLaks的说法 ,他们编译相同. 它并不快. 如果您真的关心,请使用您的平台的汇编程序输出进行编译,并查看. 没关系. 这永远不重要. 写下你喜欢的 ...

  9. c语言 case语句用大括号,c++ - 关于“ switch”中“ case”语句中的花括号 - 堆栈内存溢出...

    今天,当我尝试编写代码以仅对两个2 * 2矩阵进行加法和减法时,我使用了switch语句,但出现了一个错误: 函数main()中局部变量的大小写绕过初始化 代码 #include #include # ...

最新文章

  1. 演讲实录丨中科大陈小平教授《从封闭性到非封闭性:2020到2035年智能机器的机遇和挑战》...
  2. Science:如何高效阅读文献?
  3. 编译优化 | LLVM代码生成技术详解及在数据库中的应用
  4. Java学习笔记-网络编程
  5. 第一篇JavaScript基础
  6. mysql grep 提取错误日志_详解grep获取MySQL错误日志信息的方法
  7. 【产品能力深度解读】连续入围Gartner魔力象限的Quick BI有何魔力?
  8. A站没落了,付费会员成B站破解盈利难题的最优解?
  9. mac tree命令
  10. MFC超市商品管理系统学生成绩管理系统学生信息管理系统通讯录管理系统图书管理系统
  11. 站长技术导航二开美化网站源码 网站提交自动秒收录
  12. 游戏设计师:如何对待高考倒数100天
  13. Linux下安装OpenOffice
  14. C++ Reference: Standard C++ Library reference: C Library: cstdio: fprintf
  15. Jmeter读取excel表格数据响应数据乱码
  16. token的基本处理和存储
  17. pytorch中SiLU激活函数
  18. 40vf什么意思_LED 的基本术语VF、IV、WL、IR 解释及光通量换算...
  19. Python设计模式之享元模式(8)
  20. java导出jar包后,程序运行时读取图片、音乐资源文件

热门文章

  1. php 如何单独刷新模板,反馈一个x-admin模板的问题,点击左侧栏不会刷新右侧栏当前页面的问题,并提供解决方案。...
  2. java 抽象类_java中的抽象类
  3. matlab指令vpa(j10),matlab中vpa函数
  4. C++基础05-类构造函数与析构函数
  5. ISTQB高级-测试经理国际认证试题及答案(二)
  6. Python递归通用接口响应深层提取
  7. HTTP协议理解——计算机网络
  8. 【MySQL】JavaWeb项目中配置数据库的连接池
  9. 第十章 深入理解Session与Cookie
  10. js数组sort排序原理