1. 程式人生 > >printf函式引數的執行順序的簡單探究

printf函式引數的執行順序的簡單探究

大部分人應該都對printf函式比較瞭解,這也是作為c語言初學者第一個遇到的函式吧!!

哈哈,就是那個什麼(列印hello,world)啊,當時當被問到printf函式的執行順序的時候,好多人應該都不清楚,但是作為對c語言瞭解,並且用慣了vc6.0的人來說,可能知道,它的運算順序是從右往左,但是,真的是這樣的嗎??

下面我們通過如下的語句來驗證一下:

printf("%d   ,   %d     ,%d\n",i++, ++i, i);  

程式1:

  1. #include <stdio.h>
  2. #include <conio.h>
  3. int main(){  
  4.     int i = 3;  
  5.     printf("%d   ,   %d     ,%d\n",i++, ++i, i);  
  6.     printf("i is %d\n", i);  
  7.     getch();  
  8.     return 0;  
  9. }  

window(VC6.0)

根據兩個printf函式列印的結果以及第一個printf函式列印最右邊的值

可以得出簡單的結論:在vc6.0中,printf函式的結合性是從右到左的:

最右邊為3,然後進行中間的++i,由於先執行加1運算(之後i=4),所以整體中間的輸出為4,最後執行最左邊的i++,由於是先用原值,所以此刻輸出為4,等到printf函式執行完之後,i執行加1操作,此刻i變為5

所以第二個printf函式列印i的值為5



linux,window(dev-C++)

哈哈,是不是懵逼了呢??linux底下,並不是這樣是實現的啊!!!

恩恩,仔細想了一會還是可以想明白的:

Linux中的printf是從左往右的

第一個printf函式先執行的是最左邊的i++(這裡說,應該用原值參與後續運算,然後加1,但是,我覺得在linux裡面,printf函式如果引數有自增自減,那麼請無視後續運算子),故i+1,變成了4,之後遇到(++i)(請無視後續運算子,哈哈),直接加1,所以i的值此刻是5,再之後遇到i輸出,輸出5,此時i還是為5

第二個printf函式列印i的值,所以輸出為5

簡單總結:

printf函式引數執行的問題:

VC6.0:                     從右到左

linux,dev-c++:       從左到右

當printf函式混合自增自減的時候

對於VC6.0而言:將printf函式當作後續運算子(對前置後置而言)

linux,dev-c++:請無視後續運算子(對前置後置而言),就當作是沒有

相關推薦

Printf函式和cout函式引數執行順序以及自增與自減

Printf函式和cout函式引數執行順序以及自增與自減 總結: 在VC++ 6.0下: C程式碼:      1、printf函式的執行順序是由右到左的 2、前自增運算子(++i)先加

printf函式引數執行順序簡單探究

大部分人應該都對printf函式比較瞭解,這也是作為c語言初學者第一個遇到的函式吧!! 哈哈,就是那個什麼(列印hello,world)啊,當時當被問到printf函式的執行順序的時候,好多人

關於C語言中printf函式引數執行順序

RT...看到有類似的題目,說是從右到左,, 藍後在VS2012中寫了如下的程式碼...但是執行出來的結果如下,, 這是為啥...  留一疑惑在這先. ok,這裡有了一個解釋: i++會建立一個拷貝 %d取值輸出,引數的傳遞是從右到左壓入棧,所以從右邊開始,i++,此時拷貝

printf函式引數壓棧順序

printf函式的引數的壓棧順序和求值順序(VC++6.0編譯器) 有以下程式段: 設int arr[]={6,7,8,9,10}; int *ptr=arr; *(ptr++)+=123; printf("%d,%d",ptr,(++ptr));

Java中static塊,構造塊,建構函式執行順序

public class Father { static { System.out.println("Father靜態塊"); } { System.out.println("Father構造塊"); } public Fath

Java子類與父類中靜態程式碼塊、非靜態程式碼塊、建構函式執行順序一覽表

子類Child繼承父類Parent Child child=new Child(); 執行順序如下: ①父類靜態程式碼塊>>②子類靜態程式碼塊>>③父類非靜態程式碼塊>>④父類建構函式>>⑤子類非靜態程式碼塊>>⑥子類

unity中函式執行順序

在Unity指令碼中,有一些事件函式會在指令碼執行時按預定順序執行。 該執行順序如下所述: 編輯 Reset:Reset是用來初始化指令碼屬性的,在第一次指令碼附在物件上的時候和按下Reset按鈕的時候會被執行。 第一次場景載入 Awake:Awake方法總是在Sta

Unity5指令碼事件函式及其執行順序

指令碼函式 編輯器相關函式 初始化函式 物理相關函式 輸入相關函式 遊戲邏輯相關函式

Java靜態變數初始化及建構函式執行順序執行時機分析

    對於Java初學者來說,關於靜態變數、非靜態變數的初始化時機與順序,以及建構函式的執行時機與順序都會感覺有點理不清頭緒,下面文章使用例項程式幫大家解決這方面的疑惑。雖然簡單,但是對Java入門者來說還是有一定的幫助作用。    

【面相物件】靜態程式碼塊、構造程式碼塊和建構函式執行順序

前言:java有四大程式碼塊:靜態程式碼塊、構造程式碼塊、區域性程式碼塊、同步程式碼塊。 ……………………………………………………………………………………………… ……………………………………………………………………………………………… ………………………………………………

async/await函式執行順序的理解

最近遇到一個關於async函式使用的Bug,因程式碼涉及太多業務,所以模擬了程式碼, 如下: let testArr = [1, 2, 3] let flag = false const func = (res) => { return new Promise((resolv

探索javascript中函式執行順序

  先來第一段測試程式碼,如下所示: 測試程式碼一: [javascript] view plain copy <script language="JavaScript"> &

printf()和scanf()執行順序

原始碼:void main(){int a,b,c,x2,y2;printf("輸入a,b,c:\n");scanf("%d%d%d",&a,&b,&c);result(a,b,c,&x2,&y2);test(a,b,c,x2,y2);

深度剖析c語言main函式---main函式執行順序

  在之前的文章中,介紹了main函式的返回值 和 main函式的傳參,本文主要介紹一下main函式的執行順序。可能有的人會說,這還用說,main函式肯定是程式執行的第一個函式。那麼,事實果然如此嗎?相信在看了本文之後,會有不一樣的認識。 為什麼說main

java中靜態程式碼塊、構造程式碼塊、構造方法、main函式執行順序

靜態程式碼塊:在類被載入的時候就運行了,且只執行一次。static{} 構造程式碼塊:在建立物件時被呼叫,每次建立物件都會呼叫一次。比靜態程式碼塊少了static。{} 構造方法:用於建立物件時定義初始化的狀態。建構函式不能直接呼叫,必須通過new運算子在建立物件時才會自動呼叫,一般方法是在程式

C++在單繼承、多繼承、虛繼承時,建構函式、複製建構函式、賦值操作符、解構函式執行順序執行內容

一、本文目的與說明     1. 本文目的:理清在各種繼承時,建構函式、複製建構函式、賦值操作符、解構函式的執行順序和執行內容。     2. 說明:雖然複製建構函式屬於建構函式的一種,有共同的地方,但是也具有一定的特殊性,所以在總結它的性質時將它單獨列出來了。  

C++ 虛基類建構函式執行順序

(1)呼叫基類的建構函式,多個基類則按派生類宣告時           列出的次序、從左到右呼叫,而不是初始化列表中           的次序。 (2)呼叫物件成員(子物件)的建構函式,按類宣告中           物件成員出現的次序呼叫,而不是初始化列表中的    

靜態程式碼塊、構造程式碼塊和建構函式執行順序

靜態程式碼塊 static {   執行語句 } 在java中使用static關鍵字宣告的程式碼塊。靜態塊用於初始化類,為類的屬性初始化。 每個靜態程式碼塊只會執行一次。由於JVM在載入類時會執行靜態程式碼塊,所以靜態程式碼塊先於主方法執行。 如果類中包含多個靜態程式碼塊,那麼將按

靜態程式碼塊、非靜態程式碼塊、建構函式三者執行順序

主要探討一下關於靜態程式碼塊,非靜態程式碼塊,建構函式的執行順序。 如有錯誤,歡迎指出。 首先: 靜態成員變數和靜態程式碼塊的優先順序是一樣的,先定義的先執行。 在建立一個物件的時候會執行非靜態

c++中,類 和 類中成員(物件)的建構函式和解構函式執行順序

#include <iostream> using namespace std; class b{ public: b(){ cout<<"b gou zao han shu"<<endl; } ~b(){ cout<