printf函式引數的執行順序的簡單探究
大部分人應該都對printf函式比較瞭解,這也是作為c語言初學者第一個遇到的函式吧!!
哈哈,就是那個什麼(列印hello,world)啊,當時當被問到printf函式的執行順序的時候,好多人應該都不清楚,但是作為對c語言瞭解,並且用慣了vc6.0的人來說,可能知道,它的運算順序是從右往左,但是,真的是這樣的嗎??
下面我們通過如下的語句來驗證一下:
printf("%d , %d ,%d\n",i++, ++i, i);
程式1:
- #include <stdio.h>
- #include <conio.h>
-
int main(){
- int i = 3;
- printf("%d , %d ,%d\n",i++, ++i, i);
- printf("i is %d\n", i);
- getch();
- return 0;
- }
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<