printf函数调用时进栈的顺序

本文通过三个示例详细解析了C语言中printf函数参数的求值顺序,包括自增运算符、自减运算符及简单变量的输出顺序,并解释了如何影响最终输出结果。

————————————–(1)———————————-

# include <stdio.h>

main()

{

int i=1;

printf(”%d  %d  %d”, i ,  i++,  i++);

}

进栈顺序:

1.         i=1;算最后一个i++i=2;将加之前i的值1送入堆栈。

2.         i=2;算倒数第二个i++i=3;将加之前i的值2送入堆栈。

3.         i=3;计算ii=3;将加之前i的值3送入堆栈。

输出结果为(出栈顺序):3 2 1

————————————–(2)———————————-

# include <stdio.h>

main()

{

int i=1;

printf(”%d  %d  %d”, i ,  ++i,  ++i);

}

进栈顺序:

1.         i=1;算最后一个++ii=2;将加之后i的值2送入堆栈。

2.         i=2;算倒数第二个++ii=3;将加之后i的值3送入堆栈。

3.         i=3;计算ii=3;将加之后i的值3送入堆栈。

输出结果为(出栈顺序):3 3 2

————————————–(3)———————————-

# include <stdio.h>

main()

{

int i, j, k; i=1; j=2; k=3;

printf(”%d  %d  %d”, i ,  j,  k);

}

进栈顺序:

1.         k=3;算kk=3;将k的值3送入堆栈。

2.         j=2;算jj=2;将j的值2送入堆栈。

3.         i=1;计算ii=1;将i的值1送入堆栈。

输出结果为(出栈顺序):1 2 3

 
栈的顺序存储表示(结构)及实现,将参考程序中的两段函数代码补齐。 【参考程序】 #include <stdio.h> #define MaxSize 100 //顺序栈的初始分配空间大小 typedef char ElemType; //假设顺序栈中所有元素为char类型 typedef struct {ElemType data[MaxSize]; //保存栈中元素 int top; //栈顶指针 } SqStack; //顺序栈类型 void InitStack(SqStack &st) //初始化顺序栈st { st.top=-1; } void DestroyStack(SqStack st)//销毁顺序栈st { } int Push(SqStack &st,ElemType x)//进栈元素x {//将该函数中的代码补齐 } int Pop(SqStack &st,ElemType &x)//出栈元素x {//将该函数中的代码补齐 } int GetTop(SqStack st,ElemType &x)//取栈顶元素x {if (st.top==-1) //栈空 return 0; else {x=st.data[st.top]; return 1; } } int StackEmpty(SqStack st) //判断栈是否为空 {if (st.top==-1) return 1; else return 0; } void main() //主函数 {SqStack st; ElemType e; printf("初始化栈st\n"); InitStack(st); printf("栈%s\n",(StackEmpty(st)==1?"空":"不空")); printf("a进栈\n");Push(st,'a'); printf("b进栈\n");Push(st,'b'); printf("c进栈\n");Push(st,'c'); printf("d进栈\n");Push(st,'d'); printf("栈%s\n",(StackEmpty(st)==1?"空":"不空")); GetTop(st,e); printf("栈顶元素:%c\n",e); printf("出栈次序:"); while (!StackEmpty(st)) //栈不空循环 {Pop(st,e); //出栈元素e并输出 printf("%c ",e); } printf("\n销毁栈st\n"); DestroyStack(st); } 括号配对检查的原则是:对表达式从左向右扫描。当遇到左括号,左括号入栈;而遇到右括号,首先将栈中的栈顶元素弹出栈,再比较弹出元素是否与右括号匹配,如果两者匹配,则操作继续;否则,检查出错,打印“no”,并停止操作。当表达式全部扫描完后,如果栈为空,说明括号层次嵌套正确,打印“yes”,并停止操作。 编程提示:先创建一个存放左括号的空栈,并将“#”作为栈底元素(该“#”号用来标记算术表达式的开头)。顺序扫描表达式,当遇到非括号,继续扫描,遇到“(”进栈,而遇到“)”,与栈等元素比较,如果括号匹配,栈顶元素退栈,继续扫描表达式,否则,报错退出。 测试用例1: 输入:算数表达式——(2+3)/(4*(5-6))#(该“#”号用来标记算术表达式的结尾)输出:yes 测试用例2: 输入:算数表达式——1+2)*3 /(4+(5*6))# 输出:no 帮我补齐“将该函数中的代码补齐”的部分
最新发布
10-30
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值