printf函数输出多个printf 、前置加加或者后置加加
目錄
(1)前置加加和后置加加的區別
(2)printf輸出前置加加
(3)printf輸出后置加加
(4)printf輸出printf
(1)前置加加和后置加加的區別
首先我們先來了解一下前置加加和后置加加的區別。
前置加加在編譯器里的操作
//++a int a = 0; a = a + 1; return a;前置加加是先加一,后賦值,返回的值是加一之后的值。
后置加加在編譯器里的操作
//a++int a = 0; tmp = a; a = a + 1; return tmp;?后置加加是先把值賦給臨時量,然后再加一,返回的值是臨時量的值。
前置加加可以做左值,因為前置加加返回的是a的值,是可以進行操作的,后置加加則不可以,因為后置加加返回的是一個臨時量,并不是程序中定義的可尋址變量,不能通過地址對temp進行操作。
(2)printf輸出前置加加
#include<stdio.h>int main() {int i = 1;printf("%d,%d\n",++i,++i);return 0; }printf函數計算參數的時候是從右往左壓棧的。目的是為了計算參數的個數。編譯器首先從右往左計算各參數的值,再進行壓棧操作,最右端的"++i"的值是計算出來是2,保存在eax寄存器中,接著計算倒數第二個"++i"的值,給eax寄存器加一,保存為3,然后進行壓棧,把eax寄存器里的i的地址放入棧中,此時輸出的值是i的值,所以都是3.
(3)printf輸出后置加加
#include<stdio.h>int main() {int i = 1;printf("%d,%d\n",i++,i++);return 0; }最右端的"i++"的值為1,保存在臨時量里,計算出i的值為2,倒數第二個"i++"的值為2,i的值為3,"i++"也保存在對應的臨時量里,但是兩個臨時量保存的地址是不同的,進行壓棧操作,壓入的是保存兩個臨時量的地址,所以輸出的是2和1.
匯編指令:
(4)printf輸出printf
#include<stdio.h>int main() {int i = 33;printf("%d\n",printf("%d ",printf("%d ",i)));return 0; }首先輸出的第一個"33"是"i"的值,第二個"%d"算出來的是"33"的值的字節大小,占兩個字節,還有空格的字節長度,一共是三個字節,所以輸出的是"3",第三個"%d"算出來的是"3"的值的字節大小,占一個字節,還有空格的字節長度,一共是兩個字節,所以輸出的是2。
總結
以上是生活随笔為你收集整理的printf函数输出多个printf 、前置加加或者后置加加的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 图片合成gif_谈谈有哪些好用的制作GI
- 下一篇: CTF-Crypto密码学