1. 程式人生 > >C++裡面的print()函式的問題

C++裡面的print()函式的問題

今天碰到這麼一個問題,程式是這樣的:
#include <stdio.h> 
int f(int a, int b, int c)
{
	return 0;
}
int main()
{
	return f(printf("a"), printf("b"), printf("c"));
}

很簡單的程式對吧,我開始以為輸出“abc”,結果輸出為“cba”。(不會有人認為編譯不過吧?)

我查了很多資料,先不看我這個程式,我們先看看下面那個哥們的程式,文章在http://blog.sina.com.cn/s/blog_8d3652760100x1x1.html

裡面說到了printf列印多個引數的處理情況,其實print把引數一個個壓到棧裡,然後把引數一個個從棧頭取出來處理,處理完了之後再從棧底進行列印,整個過程就是這樣的。

比如他裡面的這句話:

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

暫定第一到第六分叫i(1)~i(6)吧,開始i的初始值為8;

程式先騰出一個空間來,把i(1),i(2),i(3),i(4),i(5),i(6)分別壓入,然後開始處理了i(6)的那個空間值為i++即為9,i(5)的那個空間值為i++即為10,

i(4)的那個空間值為i++即為11,……,一直到i(1)的那個空間值為i++即為14。好的,現在已經把棧裡的資料處理完了,開始列印了,列印則又從左邊i(1)的地方開始,打印出來為14131211109。

好了,現在回到我最上面的那段程式,有人會奇怪,對啊,我這個程式printf裡面只有一個字元變數啊,那肯定是順序執行就好了。但是不是的!!!

f(int a, int b, int c)函式也是按照壓棧的形式處理的!!!這種處理方式在程式裡比比皆是。
f()函式也是先將變數a,b,c 壓入,然後執行c這塊是什麼啊,哦,c這塊是print(“c”)好吧,那我就首先執行print(“c”)之後把它放在c這個變數的空間吧(這時已經列印了c到螢幕上了),接著是b,a。最後好了,我們執行再執行f()函式體,但是函式體裡面什麼都沒有,好吧,那就這樣返回吧。程式結束。</span>
所以結果是“cba”。

相關推薦

C++裡面的print函式的問題

今天碰到這麼一個問題,程式是這樣的:#include <stdio.h> int f(int a, int b, int c) { return 0; } int main() { return f(printf("a"), printf("b"), pr

C++用fscanf函式讀取TXT檔案內容

fscanf()函式的標頭檔案是<stdio.h>,函式原型為int fscanf(FILE*stream, constchar*format, [argument...]); 其功能為根據資料格式(format)從輸入流(stream)中寫入資料(argume

C\C++中strcat函式

將兩個char型別連結。 char d[20]="GoldenGlobal"; char *s="View"; strcat(d,s); 結果放在d中 printf("%s",d); 輸出 d 為 GoldenGlobalView (中間無空格

C程式設計--指標用“ 函式 ”對“ 陣列 ” 進行操作

函式運算元組 說明:如果有一個實引數組,想要在函式中改變此陣列中的元素的值,實參與形參的對應關係有以下4種情況: 1、實參:陣列名 ;; 形參:陣列名 2、實參:陣列名 ;; 形參:指標變數 3、實參:指標變數;; 形參:指標變數 4、實參:指標變

C程式設計--指標swap函式

swap()函式 方法一:指標法 實參:&a 形參:*x #include<stdio.h> void MySwap(int *x,int *y); int main(){ int a=5,b=9; printf("交換前:a=%d,b=

C++中virtual虛擬函式的用法詳解

在面向物件的C++語言中,虛擬函式(virtual function)是一個非常重要的概念。因為它充分體現了面向物件思想中的繼承和多型性這兩大特性,在C++語言裡應用極廣。比如在微軟的MFC類庫中,你會發現很多函式都有virtual關鍵字,也就是說,它們都是虛擬函式。難怪有人甚至稱虛擬函

C程式設計--指標用 “ 函式 ” 對 “ 多維陣列 ” 進行操作

用指向陣列的指標做函式的引數 問題描述 有一個班,3個學生,各4門課,計算總平均分以及第n個學生的成績。 程式碼實現 #include<stdio.h> void average(float *p,int n);//

C語言學習筆記:printf函式詳解

C語言中有關printf()函式的詳細使用方法: 修飾符: - digit(s) :欄位寬度的最小值。如果該欄位不能容納要列印的數或者字串,系統就會使更寬的欄位。 如%4d。 - .digit(s):精度,將結果保留到小數點後的多少位。 - h: 和整數轉

7 More Effective C++—條款10建構函式內阻止記憶體洩漏

1 提出問題 上一篇文章中,我們討論瞭如下情況,當函式doSomething()被呼叫時,heap中資源無法被釋放,導致記憶體洩漏問題發生。 void function() { MyObject *object = new MyObject; object-

C語言open和creat函式建立檔案時,檔案許可權設定相關

open()和creat()建立檔案時,檔案許可權說明 首先了解一下 umask 命令,該命令用來設定限制新檔案許可權的掩碼。當新檔案被建立時,其最初的許可權由檔案建立掩碼決定。簡單地來說,umask和open()及creat()函式的許可權碼(mode_t mode引數)共同決定你

C++基礎(4)建構函式 & 解構函式

#C++基礎 ##類的建構函式 類的建構函式是類的一種特殊的成員函式,它會在每次建立類的新物件時執行。建構函式的名稱與類的名稱是完全相同的,並且不會返回任何型別,也不會返回 void。建構函式可用於為某些成員變數設定初始值。 例: #include <i

C語言中 typeof函式的用法

前言:     typeof關鍵字是C語言中的一個新擴充套件,這個特性在linux核心中應用非常廣泛。 一,說明     typeof的引數可以是兩種形式: 表示式 或 型別 。

C++STL庫:unique函式

作用:去除相鄰元素中重複的數(實際是移動到後面) 原理:對一個有序陣列或容器,不停的從末尾將一個元素送到開頭,(重複的元素只送一個),送出的元素覆蓋原來在此位置的元素。 #include <iostream> #include <algorithm> using na

C語言 gets和scanf函式的區別

scanf( )函式和gets( )函式都可用於輸入字串,但在功能上有區別。若想從鍵盤上輸入字串"hi hello",則應該使用__gets__函式。 gets可以接收空格;而scanf遇到空格、回車和Tab鍵都會認為輸入結束,所有它不能接收空格。 char stri

C語言在中中sqrt函式的使用

C語言在中<math.h>中sqrt()函式的使用: 功 能: 計算一個非負實數的平方根 函式原型: 在VC6.0中的math.h標頭檔案的函式原型為double sqrt(double); 說明:sqrt系Square Root Calculations(

MySQL C API 使用基本函式

                                          &

基於TCP/IP協議的C++網路程式設計API函式

原始碼:http://download.csdn.net/detail/nuptboyzhb/4169959 基於TCP/IP協議的網路程式設計 定義變數——獲得WINSOCK版本——載入WINSOC

C++中的Compare函式用法

#include <iostream> #include <string> #include <cctype> using std::cout; using std::endl; using std::cin; using s

C++運算子過載成員函式方式

一、運算子過載 C++中預定義的運算子的操作物件只能是基本資料型別,實際上,對於很多使用者自定義型別,也需要有類似的運算操作。如果將C++中這些現存的運算子直接作用於使用者自定義的型別資料上,會得到什麼樣的結果呢?編譯器無法給出正常的結果,因為我們需要運算子過載,給運算子賦

canny邊緣提取之三 雙閾值計算 matlab中edge(I,'canny')函式中sselectThresholds函式C++轉換

1.matlab函式imhist函式 [B,X]=imhist(A,n)  %A定義為double型別 作用:將0~1區間劃分為n個區間,統計矩陣A在各個區間的頻率 引數:B--A出現在各個區間的頻率            X--n個區間的每個標記。 解釋:X有n個數據0,