mysql宏參數_C語言帶參數的宏定義

C語言允許宏帶有參數。在宏定義中的參數稱為“形式參數”,在宏調用中的參數稱為“實際參數”,這點和函數有些類似。

對帶參數的宏,在展開過程中不僅要進行字符串替換,還要用實參去替換形參。

帶參宏定義的一般形式為:

#define 宏名(形參列表) 字符串

在字符串中可以含有各個形參。

帶參宏調用的一般形式為:

宏名(實參列表);

例如:

#define M(y) y*y+3*y //宏定義

// TODO:

k=M(5); //宏調用

在宏展開時,用實參 5 去代替形參 y,經預處理程序展開后的語句為k=5*5+3*5。

【示例】輸出兩個數中較大的數。

#include

#define MAX(a,b) (a>b) ? a : b

int main(){

int x , y, max;

printf("input two numbers: ");

scanf("%d %d", &x, &y);

max = MAX(x, y);

printf("max=%d\n", max);

return 0;

}

運行結果:

input two numbers: 10 20

max=20

程序第 2 行定義了一個帶參數的宏,用宏名MAX表示條件表達式(a>b) ? a : b,形參 a、b 均出現在條件表達式中。程序第 7 行max = MAX(x, y)為宏調用,實參 x、y 將用來代替形參 a、b。宏展開后該語句為:

max=(x>y) ? x : y;

對帶參宏定義的說明

1) 帶參宏定義中,形參之間可以出現空格,但是宏名和形參列表之間不能有空格出現。例如把:

#define MAX(a,b) (a>b)?a:b

寫為:

#define MAX (a,b) (a>b)?a:b

將被認為是無參宏定義,宏名 MAX 代表字符串(a,b) (a>b)?a:b。宏展開時,宏調用語句:

max = MAX(x,y);

將變為:

max = (a,b)(a>b)?a:b(x,y);

這顯然是錯誤的。

2) 在帶參宏定義中,不會為形式參數分配內存,因此不必指明數據類型。而在宏調用中,實參包含了具體的數據,要用它們去替換形參,因此實參必須要指明數據類型。

這一點和函數是不同的:在函數中,形參和實參是兩個不同的變量,都有自己的作用域,調用時要把實參的值傳遞給形參;而在帶參數的宏中,只是符號的替換,不存在值傳遞的問題。

【示例】輸入 n,輸出 (n+1)^2 的值。

#include

#define SQ(y) (y)*(y)

int main(){

int a, sq;

printf("input a number: ");

scanf("%d", &a);

sq = SQ(a+1);

printf("sq=%d\n", sq);

return 0;

}

運行結果:

input a number: 9

sq=100

第 2 行為宏定義,形參為 y。第 7 行宏調用中實參為 a+1,是一個表達式,在宏展開時,用 a+1 代換 y,再用 (y)*(y) 代換 SQ,得到如下語句:

sq=(a+1)*(a+1);

這與函數的調用是不同的,函數調用時要把實參表達式的值求出來再傳遞給形參,而宏展開中對實參表達式不作計算,直接按照原樣替換。

3) 在宏定義中,字符串內的形參通常要用括號括起來以避免出錯。例如上面的宏定義中 (y)*(y) 表達式的 y 都用括號括起來,因此結果是正確的。如果去掉括號,把程序改為以下形式:

#include

#define SQ(y) y*y

int main(){

int a, sq;

printf("input a number: ");

scanf("%d", &a);

sq = SQ(a+1);

printf("sq=%d\n", sq);

return 0;

}

運行結果為:

input a number: 9

sq=19

同樣輸入 9,但結果卻是不一樣的。問題在哪里呢?這是由于宏展開只是簡單的符號替換的過程,沒有任何其它的處理。宏替換后將得到以下語句:

sq=a+1*a+1;

由于 a 為 9,故 sq 的值為 19。這顯然與題意相違,因此參數兩邊的括號是不能少的。即使在參數兩邊加括號還是不夠的,請看下面程序:

#include

#define SQ(y) (y)*(y)

int main(){

int a,sq;

printf("input a number: ");

scanf("%d", &a);

sq = 200 / SQ(a+1);

printf("sq=%d\n", sq);

return 0;

}

與前面的代碼相比,只是把宏調用語句改為:

sq = 200/SQ(a+1);

運行程序后,如果仍然輸入 9,那么我們希望的結果為 2。但實際情況并非如此:

input a number: 9

sq=200

為什么會得這樣的結果呢?分析宏調用語句,在宏展開之后變為:

sq=200/(a+1)*(a+1);

a 為 9 時,由于“/”和“*”運算符優先級和結合性相同,所以先計算 200/(9+1),結果為 20,再計算 20*(9+1),最后得到 200。

為了得到正確答案,應該在宏定義中的整個字符串外加括號:

#include

#define SQ(y) ((y)*(y))

int main(){

int a,sq;

printf("input a number: ");

scanf("%d", &a);

sq = 200 / SQ(a+1);

printf("sq=%d\n", sq);

return 0;

}

由此可見,對于帶參宏定義不僅要在參數兩側加括號,還應該在整個字符串外加括號。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/453660.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/453660.shtml
英文地址,請注明出處:http://en.pswp.cn/news/453660.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

自定義過濾器

首先在web.xml中對過濾器的監聽 1 <!-- 自定義過濾器 -->2 <filter>3 <filter-name>AscFilter</filter-name>4 <filter-class>com.llh.filter.AscFilter</filter-class>5 </filter>6 <filter-mapping>7 …

[MS Sql Server術語解釋]預讀,邏輯讀,物理讀

在MSSQL中使用 SET STATISTICS IO ON 打開IO統計功能之后&#xff0c;每次執行完一個查詢就會在下面的【消息】面板中顯示本次查詢IO的統計信息。 (0 行受影響) 表 demo。掃描計數 1&#xff0c;邏輯讀取 622 次&#xff0c;物理讀取 0 次&#xff0c;預讀 0 次&#xff0c;lob…

mysql 數據庫查詢測試_MySQL查詢測試經驗

測試表geoinfo,整個表超過1100萬行&#xff0c;表結構&#xff1a;CREATE TABLEgeoinfo (objectidint(11) NOT NULLAUTO_INCREMENT ,latitudedouble NOT NULL,longitudedouble NOT NULL,occupancybit(1) NOT NULL,timedatetime NOT NULL,cabidvarchar(16) NOT NULL,PRIMARY KEY…

更改阿里云域名解析臺里某個域名綁定的IP之后不能解析到新IP

1.由于要撤銷一組負載均衡&#xff0c;所以需要更改阿里云域名解析臺里某個域名由原來綁定的負載均衡公網IP換到服務器公網IP 2.在服務器上nginx指定了域名訪問&#xff0c;開啟nginx服務 3.暫時關閉該組負載均衡服務 4.實現通過服務器IP可以訪問項目&#xff0c;域名訪問不了 …

秒懂數據類型的真諦—Python基礎前傳(4)

一切編程語言都是人設計的&#xff0c;既然是人設計的&#xff0c;那么設計各種功能的時候就一定會有它的道理&#xff0c;那么設計數據類型的用意是什么呢&#xff1f; (一) 基本數據類型 基本數據類型&#xff1a; 數字 int字符串 str布爾值 bool列表 list元組 tuple字典 dic…

Linux 系統命令及其使用詳解(大全)

Linux 系統命令及其使用詳解(大全) (來源: 中國系統分析員) cat cd   chmod chown   cp cut   名稱&#xff1a;cat   使用權限&#xff1a;所有使用者   使用方式&#xff1a;cat[-AbeEnstTuv] [--help] [--version] fileName   說明&#xff1a;把檔案串連…

wordpress配置SMTP服務發送郵件

使用SMTP服務發送郵件&#xff0c;需要使用一個插件&#xff1a;http://wordpress.org/extend/plugins/wp-mail-smtp/ 下載完成以后解壓到plugin目錄&#xff0c;然后在插件中啟用這個插件。 配置SMTP服務 SMTP的選項 發送一封測試郵件吧 >>> 本文轉自齊師傅博客園博客…

使用rpm包安裝mysql_centos下利用rpm包安裝mysql

安裝mysql步驟&#xff1a;第一、 http://www.mysql.com/downloads/mysql-4.0.html下載MySQL-client-5.0.96-1.glibc23.x86_64.rpm和MySQL-server-5.0.96-1.glibc23.x86_64.rpm第二、安裝服務端&#xff1a;[rootlfl01 mysql]# rpm -ivh MySQL-server-5.1.73-1.glibc23.i386.rp…

maxN - 返回數組中N個最大元素 minN - 返回數組中N個最小元素

從提供的數組中返回 n 個最小元素。如果 n 大于或等于提供的數組長度&#xff0c;則返回原數組&#xff08;按降序排列&#xff09;。 結合使用Array.sort() 與展開操作符(...) &#xff0c;創建一個數組的淺克隆&#xff0c;并按降序排列。 使用 Array.slice() 以獲得指定的元…

Linux 常用命令

Linux之所以受到廣大計算機愛好者的喜愛&#xff0c;主要原因有兩個&#xff0c;首先它是自由軟件&#xff0c;用戶不用支付費用就可以使用它&#xff0c;并可根據自己的需要對它進行修改。另外&#xff0c;它具有Unix的全部功能&#xff0c;任何使用Unix系統或想要學習Unix系統…

使用Server 2008新GPO做驅動器映射

在Server 2003的時代&#xff0c;我們為用戶做網絡驅動器映射(以下就直接稱為Map Network Drive&#xff09;, 通常可能有以下的做法. 方法一: 做一個登錄腳本&#xff0c;放在DC的netlogon目錄&#xff0c;接著在“Active Directory用戶和計算機”控制臺的用戶屬性的Logon S…

electron 打包后 __static_electron開發客戶端注意事項(兼開源個人知識管理工具“想學嗎”)...

窗口間通信的問題electron窗口通信比nwjs要麻煩的多electron分主進程和渲染進程&#xff0c;渲染進程又分主窗口的渲染進程和子窗口的渲染進程主窗口的渲染進程給子窗口的渲染進程發消息subWin.webContents.on(dom-ready, () > {subWin.webContents.send(message, {title: s…

180118 有趣的人工智能對話小程序

print(Hello world!) #輸入 print(What is your name?) # ask for their name 詢問名字 myName input()   #該你來回答名字了 print(It is good to meet you, myName)  #根據你的名字來給你打個招呼 print(The length of your name is:)  #然后看下一句 print(len(…

Linux 內核調試器 調試指南

Linux 內核調試器內幕 KDB 入門指南 Hariprasad Nellitheertha (nhariprain.ibm.com), 軟件工程師, IBM簡介&#xff1a; 調試內核問題時&#xff0c;能夠跟蹤內核執行情況并查看其內存和數據結構是非常有用的。Linux 中的內置內核調試器 KDB 提供了這種功能。在本文中您將了解…

學習API HOOK,編寫了一個winsock 的封包抓取程序,可免費使用;

開發環境是:windows 2000 delphi 7 監視API&#xff1a;recv,recvfrom,WSARecvEx,send,sendto,accept,bind,closesocket,connect socket 版本&#xff1a;wsock32.dll/*ws2_32.dll(暫時有兼容問題) 目前還不支持修改封包&#xff1b; 當前實現針對某個進程或多個選定進程的通…

fib函數用python編寫_Python中利用函數裝飾器實現備忘功能

“備忘”的定義“memoization”(備忘)這個詞是由Donald Michie在1968年提出的&#xff0c;它基于拉丁語單詞“memorandum”(備忘錄)&#xff0c;意思是“被記住”。雖然它和單詞“memorization”在某種程度上有些相似&#xff0c;但它并不是該單詞的錯誤拼寫。實際上&#xff0…

MyBatis學習總結(二)——使用MyBatis對表執行CRUD操作

MyBatis學習總結(二)——使用MyBatis對表執行CRUD操作 上一篇博文MyBatis學習總結(一)——MyBatis快速入門中我們講了如何使用Mybatis查詢users表中的數據&#xff0c;算是對MyBatis有一個初步的入門了&#xff0c;今天講解一下如何使用MyBatis對users表執行CRUD操作。本文中使…

cifs mount 掛載共享目錄_安裝cifsutils解決linux掛載windows共享文件夾

1、安裝mount.cifs軟件包yum install cifs-utils -y如果是離線環境&#xff0c;請參考我的另一篇文章https://blog.csdn.net/qq_37119960/article/details/1083313732、開始掛載mount.cifs //192.168.1.110/share /usr/local/winshare -o useradministrator,pass123456參數說明…

JFinal框架

FJinal過濾器(tomcat) 創建java類繼承JFinalConfig 會實現六個方法(有一個是攔截器的方法好像是,那個我好像看的跟struts2一樣但是又沒看懂暫時不寫) Controller層的測試方法 Entity實體類 常用方法 查詢 增加 刪除 修改 轉載于:https://www.cnblogs.com/guanzhuang/p/8317949.…

掌握 Linux 調試技術 使用 GDB 調試 Linux 軟件

簡介&#xff1a; 您可以用各種方法來監控運行著的用戶空間程序&#xff1a;可以為其運行調試器并單步調試該程序&#xff0c;添加打印語句&#xff0c;或者添加工具來分析程序。本文描述了幾種可以用來調試在 Linux 上運行的程序的方法。我們將回顧四種調試問題的情況&#xf…