程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 小心!#define max(a,b) a>b?a:b

小心!#define max(a,b) a>b?a:b

編輯:關於C語言

今天做oj的時候,定義了兩個宏:

#define max_2(a,b) a>b?a:b
 max_3(a,b,c) (a>b?a:b)>c?(a>b?a:b):c

然後程序結果總是WA,仔仔細細檢查程序的邏輯一遍又一遍,都快抓狂了,最後終於發現是我定義的兩個宏有問題。改為如下就AC了:

 max_2(a,b) (a>b?a:b)
 max_3(a,b,c) ((a>b?a:b)>c?(a>b?a:b):c)

 

下邊是分析過程:

先上兩段有問題的代碼:

#include <iostream>
 max_2(x,y) x>y?x:y
  a=max_2(,)+ b=max_2(,)+ c=max_2(, d=max_2(, e=(max_2(,)+<<a<< <<b<<<<c<< <<d<<<<e<< 

運行結果:

從程序中變量c、d可以發現,max_2(x,y)裡不論x、y的順序如何,max_2(x,y)能夠返回正確的結果;

從程序中變量a、b可以發現,運算順序跟max_2(x,y)裡x、y的順序有關,當x>y時,程序先將max_2(2,1)的結果賦給b,而不是加3之後再賦給b;

從程序中變量e可以發現,即使加了括號,也不能改變這種運算順序。

 

另一段問題代碼,如下圖,編譯都不能通過:

 

所以,不要忘了關鍵的括號,不然害人不淺。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved