linux系统下printf函数可变参数的计算顺序

#include<stdio.h> 
void main() 
{ 
	int i=5; 
	//printf("%d,%d,\n",i,i++); //输出 6,5,
	//printf("%d,%d,\n",i++,i); //输出 6,6,
	//printf("%d,%d,\n",i,++i); //输出 6,6,
	//printf("%d,%d,\n",++i,i); //输出 6,6,
	//printf("%d,%d,\n",i++,++i); //输出 6,7,
	//printf("%d,%d,\n",++i,i++); //输出 7,5,
	//printf("%d,%d,\n",i++,i++); //输出 6,5,
	//printf("%d,%d,\n",++i,++i); //输出 7,7,

	//由此得出:可变参数是从右到左计算的,并且后自增(i++)是先将i当前值保存,然后自增,接着继续处理左边的参数。而i和i前自增是先计算。计算结束后依次入栈,因此后自增打印出来的是i在从右向左计算过程中当前的I值,而i,++i最终输出的都是I的最终值。
	因此:

	//printf("%d,%d,%d,%d,\n",++i,i++,++i,i); //输出 8,6,8,8,
	//printf("%d,%d,%d,%d,\n",++i,++i,++i,++i); //输出 9,9,9,9,
	//printf("%d,%d,%d,%d,\n",i++,i++,i++,i++); //输出 8,7,6,5,
	//printf("%d,%d,%d,%d,%d,\n",i++,++i,i,++i,i++); 8,9,9,9,5,
}
时间: 2024-12-08 16:40:38

linux系统下printf函数可变参数的计算顺序的相关文章

【C语言】模拟实现printf函数(可变参数)

一.printf函数介绍 printf功能 printf函数是格式化输出函数,一般用于向标准输出设备按规定格式输出信息. printf原型 int printf( const char* format , [argument] ... ); //定义在stdio.h中 以上部分来自于高小调博客(一个UI非常好,没有广告,纯绿色的博客,建议大家收藏) 二.利用可变参数列表模拟实现printf 1.分析printf函数 printf("Hello haohaosong!\n"); prin

C/C++知识要点4——printf函数以及cout的计算顺序

printf函数的计算顺序:先从右到左压栈,然后从左到右出栈. 例程: #include"stdio.h" int main() { int arr[] = { 1, 2, 3, 4, 5 }; int *ptr = arr; printf("%d %d\n", *ptr, *(++ptr)); return 0; } 输出:2 ,2 计算顺序:先计算*(++ptr).进行压栈,然后计算*(ptr).再压栈. 注意:++ptr 和 ptr++ 的计算顺序.会导致不同

Unix/Linux系统下获得时间戳函数

在Unix/Linux系统下,使用gettimeofday函数来获得当前系统的时间戳,精度可达到微秒(microsecond,即μs)级别. 通过结构体timeval来存放当前时间戳的信息: #ifndef _STRUCT_TIMEVAL #define _STRUCT_TIMEVAL struct timeval _STRUCT_TIMEVAL { __darwin_time_t tv_sec; /* seconds */ __darwin_suseconds_t tv_usec; /* an

Linux系统下动态库的生成

Linux系统下动态库的生成 一.简述 Linux下动态库文件的扩展名为 ".so"(Shared Object).按照约定,所有动态库文件名的形式是libname.so(可能在名字中加入版本号).这样,线程函数库被称作libthread.so.静态库的文件名形式是libname.a.共享archive的文件名形式是libname.sa.共享archive只是一种过渡形式,帮助人们从静态库转变到动态库.      小编综合自己学习体会以及网络上较好的内容,以简单的例子介绍动态库文件的生

linux系统下信号详解2

信号是UNIX 系统所使用的进程通信方法中,最古老的一种.信号不但能从内核发往一个进程,也能从一个进程发往另一个进程.例如,用户在后台启动了一个要运行较长时间的程序,如果想中断其执行,可以用kill 命令把SIGTERM信号发送给这个进程,SIGTERM 将终止此进程的执行.信号还提供了向UNIX 系统进程传送软中断的简单方法.信号可以中断一个进程,而不管它正在作什么工作.由于信号的特点,所以不用它来作进程间的直接数据传送,而把它用作对非正常情况的处理.由于信号本身不能直接携带信息,这就限制了它

linux系统下,警告:warning: implicit declaration of function ‘gets’ [-Wimplicit-function-declaration] 和 warning: the `gets&#39; function is dangerous and should not be used. 的由来和解决方法。

字符数组 的英文名字是 char [] gets()函数的基本用法为:char *gets(char *s); 该函数的参数是一个字符数组,该函数的返回值也是一个字符数组. linux下的代码如下: 1 #include <stdio.h> 2 3 int main() 4 { 5 char a[100] = { 0 }; 6 gets(a); 7 printf("%s\n", a); 8 return 0; 9 }-----------------------------

C语言之函数可变参数

先上一段代码: #include<cstdarg> #include<iostream> #include<string> using namespace std; void error(char* format,...){//至少要有一个参数,后边的...表示参数可变 va_list ap; int d,flag; char c, *s; va_start(ap,*format);//从args参数开始后面都是可变参数,va_start,va_end都为宏 while

linux系统下C语言调用lapack ,blas库

在利用C语言编程,经常调用其他的软件包,其中lapack,blas库是最常用的两个库,这里讲下在linux系统下,C语言编程如何调用这两个库: 1.首先讲下blas库的调用,这里以两个向量内积函数为例: #include <stdio.h> #include <math.h> double ddot_(int *,double *,int *,double *,int *); int main() { int N=2, INCX=1, INCY=1; double X[2]={1.

64位linux系统下编译int32_t

在64位Linux系统下编译执行一下程序输出结果为 40 8 #include <stdio.h> #include <stdlib.h> #include <stdint.h> void print_size(int32_t array[10]){ printf("%ld\n",sizeof(array)); } int main() { int32_t myarray[10]; printf("%ld\n",sizeof(my