爱站网做网站吗,企业在阿里做网站是什么意思,分类信息网有哪些平台,哪些建材网站可以做宣传你不能使用%d来打印long long 。 你必须使用%lld 。 (因此请使用\\n%d %d | %lld %lld | %d %d作为格式字符串。)特别是#xff0c;显而易见的是#xff0c;在“52 0 | 52 0”中#xff0c;第一个52 0是a.rez #xff0c;第二个52 0是b.rez (这些中的每一个都是…你不能使用%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位数量。