2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
C भाषायां केचन सेटिङ्ग्स् सन्तिपूर्वनिर्धारितचिह्नानि, प्रत्यक्षतया उपयोक्तुं शक्यते, पूर्वनिर्धारितचिह्नानि सन्ति在预处理期间处理的
。
__FILE__ //进行编译的源文件
__LINE__ //文件当前的行号
__DATE__ //文件被编译日期
__TIME__ //文件被编译那一瞬的时间
__STDC__ //如果编译器遵循ANSI C(标准C),其值为1,否则未定义(报错)
उदाहरण:
#include<stdio.h>
int main()
{
printf("%sn", __FILE__);
printf("%dn", __LINE__);
printf("%sn", __DATE__);
printf("%sn", __TIME__);
return 0;
}
संचालन परिणाम : १.
अहम् अत्र उल्लेखयितुम् इच्छामि यत् VS ANSI C (standard C) इत्यस्य पूर्णतया समर्थनं न करोति; gcc gccछसीसी ANSI C (मानक C) समर्थयति
मूलभूतवाक्यविन्यासः १.
# define name stuff
उदाहरणतया:
#define MAX 100
#define reg register // 为 register 这个关键字创建一个简短的名字
#define do_forever for(;;) //用更形象的符号来替换一种实现
#define CASE break;case //在写 case 语句的时候自动吧 break 写上
//如果定义的 stuff 过长,可以分成几行写,除了最后一行外,每行的后面都加一个反斜杠(续行符)
#define DEBUG_PRINT printf("file:%stline:%dt
date:%sttime:%sn" ,
__FILE__,__LINE__ ,
__DATE__,__TIME__ )
- द्वितीयं वाक्यं आलस्यम्, किमर्थम् ?
- तृतीयं वाक्यम् हि हिचवा परिपत्रम्
初始化、判断、调整都可以省略
, किन्तु न्यायस्य लोपः चेत् न्यायस्थितिः सर्वदा सत्या इत्यर्थःअनन्त पाशः- चतुर्थे क्रीडने एतत् न कर्तुं श्रेयस्करम्, सहजतया कष्टं जनयितुं शक्नोति।
- पञ्चमं वाक्यम्रेखा निरन्तरता वर्णशाखाकरणानन्तरं समस्यानां निवारणार्थम् अस्ति
转义
पृष्ठभागः回车符
, येन वाहनप्रत्यागमनं न पुनः वाहनप्रत्यागमनं भवति।रेखानिरन्तरतावर्णस्य अनन्तरं किमपि न भवितुम् अर्हति, नुदतु“”
केवलं Enter नुदन्तु, अन्यथा निरन्तरता निम्नलिखित कोडपङ्क्तिः न भविष्यति ।
अधुना समस्या आगच्छति : प्रयोगः # . परिभाषयतु परिभाषयतुघङचइत्यस्मिन्ङ परिचयकं परिभाषयन्ते सति अन्ते योजयितव्यं वा?;
?
उदाहरणतया:
#define MAX 1000
#define MAX 1000;
int main()
{
int n = MAX;
return 0;
}
उपर्युक्तः कोडः प्लस्;
, इदं केवलं किञ्चित् अनावश्यकं दृश्यते, परन्तु कार्यक्रमस्य चालने तस्य कोऽपि प्रभावः नास्ति ।
योजयति इव;
अथवा मा योजयतु;
सर्वं सम्यक् भविष्यति ?
किं तत्त्वतः एवम् अस्ति ?
निम्नलिखितम् उदाहरणं पश्यामः ।
//例一
int main()
{
printf("%dn", MAX);
return 0;
}
//例二
int mian()
{
int max = 0;
if (1)
max = MAX;
else
max = 1;
return 0
}
प्रतिस्थापनानन्तरं : १.
printf("%dn", 1000;);
मुद्रण1000;
किम् इत्यर्थः ?
if (1)
max = 1000;
;
else
max = 1;
अन्यथाङलसे कस्य मेलनं कर्तव्यम् ?
पश्यन्तु, अस्मिन् किमपि दोषः अस्ति, अतःउपयुञ्जताम् # परिभाषयतु परिभाषयतुघङचइत्यस्मिन्ङ सूचकं परिभाषयन्ते सति तदनन्तरं न योजयन्तु;
# परिभाषयतु परिभाषयतुघङचइत्यस्मिन्ङ तन्त्रे एकः प्रावधानः अन्तर्भवति,允许把参数替换到文本中
, एतत् कार्यान्वयनम् प्रायः उच्यतेमैक्रो ( मार्को ) (मार्को) .(मर्को)वा मैक्रो परिभाषयतु ( definemacro ) (macro परिभाषित करें) .(घङचइत्यस्मिन्ङमक्रो)
उपरिष्टात् मैक्रोस् तथा मैक्रो परिभाषापरिचयकानां मध्ये अन्तरं अस्ति :मैक्रो इत्यस्य मापदण्डाः सन्ति
अत्र मैक्रो कथं घोषितं भवति :
#define name(parament - list) stuff
तेषु एकः परमेण्ट् परमेन्ट्पृएकःरअस्मिङनत - सूचीसूचीलअहम्सत(parameter list) इति चिह्नानां अल्पविरामेन पृथक्कृता सूची अस्ति, येषु दृश्यते द्रव्यं द्रव्यम्सतउff मध्यं
टीका: परमेण्ट् परमेन्ट्पृएकःरअस्मिङनत - सूचीसूचीलअहम्सत(पैरामीटर् सूची) २.वामकोष्ठकंअवश्यं सह भवितव्यम् नाम नामनमङ अग्रिम, यदि तेषां मध्ये किमपि श्वेतस्थानं वर्तते तर्हि तर्कसूची यथा व्याख्यायते द्रव्यं द्रव्यम्सतउff a part of.
उदाहरण:
//实现一个宏,计算一个数的平方
#define SQUARE(x) x*x
int main()
{
int a = 5;
int ret = SQUARE(a);
printf("%dn", ret);
return 0;
}
संचालन परिणाम : १.
यथा भवन्तः पश्यन्ति, ५ इत्यस्य वर्गः सम्यक् गण्यते
परन्तु वस्तुतः उपर्युक्तसङ्केतस्य समस्या अस्ति कृपया निम्नलिखितसङ्केतखण्डं पश्यन्तु ।
int a = 5;
printf("%dn", SQUARE(a + 1));
संचालन परिणाम : १.
किमर्थमिदम् ? ५+१ इत्यस्य परिणामः ३६, ६ च भवति ∗ * ∗ ६ भवितुमर्हति ३६ कथं भवता ११ प्राप्तम् ?
समस्या मैक्रोस् इत्यस्य अस्ति इति वयं जानीमः宏是直接替换
, तर्हि उपर्युक्तसङ्केतस्य प्रत्यक्षप्रतिस्थापनस्य परिणामः अस्ति :
printf("%dn", a+1*a+1);
५ + ६ + १, परिणामः स्वाभाविकतया ११
मैक्रो परिभाषायाः उभयतः कोष्ठकं योजयित्वा वयं सहजतया एतस्याः समस्यायाः समाधानं कर्तुं शक्नुमः ।
#define SQUARE(x) (x)*(x)
अतः अस्याः परिभाषायाः कोऽपि समस्या नास्ति वा ?निम्नलिखित स्थूलपरिभाषां अवलोकयामः ।
#define DOUBLE(X) (X)+(X)
पूर्वसमस्यां परिहरितुं परिभाषायां वयं कोष्ठकं प्रयुक्तवन्तः, परन्तु एतत् मैक्रो नूतनानि त्रुटयः जनयितुं शक्नोति ।
int a = 5;
printf("%dn", 10 * DOUBLE(a));
संचालन परिणाम : १.
आउटपुट् परिणामः १०० न अपितु ५५.कारणं उपर्युक्तस्य सदृशम् अस्ति प्राथमिकता प्रश्न
समाधानं:
#define DOUBLE(X) ((X)+(X))
सारांशेन मैक्रोस् इत्यस्य उपयोगं कुर्वन्कोष्ठकं कदापि न स्कम्पं कुर्वन्तुमैक्रोस् इत्यस्य उपयोगं कुर्वन् पैरामीटर्स् अथवा समीपस्थेषु ऑपरेटर् मध्ये ऑपरेटर् मध्ये अप्रत्याशितपरस्परक्रियाः परिहरितुं ।
यदा मैक्रो पैरामीटर् एकवारादधिकं मैक्रो परिभाषायां दृश्यते, यदि पैरामीटर् अस्तिदुष्प्रभावः, तर्हि भवन्तः एतस्य मैक्रो इत्यस्य उपयोगं कुर्वन् संकटे भवितुम् अर्हन्ति, यस्य परिणामः भवति不可预测
इति परिणामः । अभिव्यञ्जनस्य मूल्याङ्कनसमये दुष्प्रभावाः स्थायिप्रभावाः भवन्ति ।
उदाहरणतया:
x + 1; //不带副作用
x++; //带副作用
निम्नलिखित MAX मैक्रो दुष्प्रभावयुक्तैः मापदण्डैः उत्पद्यमानानि समस्यानि दर्शयति ।
#define MAX(a,b) ((a) > (b) ? (a):(b))
int main()
{
int x = 5;
int y = 8;
int z = MAX(x++, y++);
printf("x=%d, y=%d, z=%dn", x, y, z);
return 0;
}
संचालन परिणाम : १.
किमर्थमिदम् ?मिलित्वा तस्य विश्लेषणं कुर्मः
z = ((X++) > (y++) ? (x++) : (y++))
- प्रथमं निर्णयं कुरुत- १. xxx++ सह य्य्य्++ न्यायः, उत्तरपदत्वात् ++, न्याये xxx इति ५, ९. य्य्य् इति ८, ८ > ५
- न्यायं कृत्वा xxx इति ६, ९. य्य्य् कृते ९
- ततः निष्पादयन्तु य्य्य् ++, उत्तरनियतत्वात् ++ परिणामः ९
- ततः अग्रे गच्छतु य्य्य् स्वयम्-वृद्धिं कुर्वन्तु, . य्य्य् अन्तिमः परिणामः १० भवति
वयं करिष्यामः xxx तथा य्य्य् यदा मैक्रो मध्ये पारितं तदा परिणामाः परिवर्तिताः, विशेषतः य्य्य्, परिवर्तनद्वयानन्तरं भवता उक्तं यत् इदं न भयंकरं अस्ति
यदा दुष्प्रभावयुक्तः पैरामीटर् मैक्रो-मध्ये पारितः भवति, तथा च मैक्रो-मध्ये एकवारादधिकं पैरामीटर् दृश्यते तदा पैरामीटर्-पार्श्वप्रभावः अपि एकवारादधिकं भवति
कार्यक्रमे विस्तारं कुरुत # . परिभाषयतु परिभाषयतुघङचइत्यस्मिन्ङ चिह्नानि, मैक्रो च परिभाषयन्ते सति अनेकानि सोपानानि प्रवृत्तानि सन्ति
参数进行检查
, पश्यन्तु तस्मिन् # . परिभाषयतु परिभाषयतुघङचइत्यस्मिन्ङ विवक्षितम्标识符
.यदि एवम् तर्हि प्रथमं प्रतिस्थाप्यन्ते被插入
कार्यक्रमे मूलस्थानं प्रति, यत्र मैक्रो पैरामीटर् नामानि तेषां मूल्यैः प्रतिस्थापितानि सन्ति#define MAX(a,b) ((a) > (b) ? (a):(b))
#define M 10
int main()
{
int x = 5;
int z = MAX(x, M);
return 0;
}
उपर्युक्तसङ्केते MAX अपि # 1000 इत्यनेन प्रतिनिधित्वं भवति । परिभाषयतु परिभाषयतुघङचइत्यस्मिन्ङ विवक्षितम्मैक्रो .अन्तिमे निरीक्षणे तस्य पैरामीटर् M प्रतिस्थापितम् अस्ति अस्मिन् समये प्रतिस्थापनस्य समयः अस्ति ।
अधिकतम ( x , 10 ) अधिकतम(x, 10) .मएकःX(x,10) इति प्रतिस्थाप्यते ( ( x ) > ( 10 ) ((x) > (10) .((x)>(10)
?
?
? ( x ) : ( 10 ) ) (x):(10)) .(x):(10))
निश्चयेन,宏里面嵌套宏
तत् अपि सुष्ठु अस्ति
MAX(x, MAX(2, 3))
अस्मिन् समये प्रथमं पैरामीटर् मध्ये मैक्रो प्रतिस्थापयन्तु, ततः सम्पूर्णं मैक्रो प्रतिस्थापयन्तु
किन्तु एतत् द्रष्टव्यम्不是递归
, यत् केवलं एकं मैक्रो अस्ति यत् अन्यस्य मैक्रो इत्यस्य तर्करूपेण कार्यं करोति ।递归是宏内部又调用了宏本身
。
अपि च, यदा पूर्वसंसाधकः # . परिभाषयतु परिभाषयतुघङचइत्यस्मिन्ङ प्रतीकं परिभाषयन्ते सति ।स्ट्रिंग् स्थिरांकानाम् सामग्रीः न अन्वेषिता भवति
तस्य किम् अर्थः ?केवलं चेस्टनट् ददातु तर्हि भवन्तः अवगमिष्यन्ति।
#define M 10
int main()
{
int x = 5;
int z = MAX(x, MAX(2, 3));
printf("M = %d", x);
return 0;
}
उपर्युक्ते संहितायांprintf("M = %d", x);
मध्यं एम.एमम 10 इत्यनेन प्रतिस्थाप्यते न भविष्यति
उपर्युक्तस्य मैक्रो इत्यस्य उपयोगेन द्वयोः सङ्ख्यायोः बृहत्तरं मूल्यं ज्ञातुं शक्यते यत् वयं तत् पूर्णतया फंक्शन् रूपेण लिखितुं शक्नुमः ।
int Max(int x, int y)
{
return x > y ? x : y;
}
ते सर्वे समानं कार्यं साधयन्ति इति वयं ज्ञातवन्तः।परन्तु "द्वयोः सङ्ख्यायोः बृहत्तरं अन्वेष्टुम्" इति कार्याय, मैक्रो लेखनं करिष्यति更有优势
केचन
तत्र कारणद्वयम्- १.
- प्रयुक्ता इति
调用函数
तथा函数返回
इत्यस्यकोडयथार्थतः एतां लघुगणनां (फंक्शन् आह्वयति समये) कर्तुं अपेक्षया अधिकं समयं गृह्णीयात्स्टैक फ्रेम रचयन्तु ).अतः मैक्रो रेशियो फंक्शन् प्रोग्राम् मध्ये अस्ति规模
तथा速度
पूर्वस्मात् अपि श्रेष्ठम्- अतः अधिकं महत्त्वपूर्णम्
函数的参数必须声明类型
, येन समुचितप्रकारस्य व्यञ्जनेषु एव कार्यस्य उपयोगः भवति ।तद्विपरीतम्, एतत् मैक्रो बहुविधेषु प्रयोक्तुं शक्यते : पूर्णाङ्कः, दीर्घपूर्णाङ्कः, प्लवमानबिन्दुः इत्यादयः उपयोक्तुं शक्यन्ते
>
तुलनां कर्तुं ।मैक्रो इत्यस्य मापदण्डाः सन्तिस्वतन्त्र इति टङ्कयन्तुइत्यस्य。
भविष्ये वयं सर्वदा मैक्रो-इत्यस्य उपयोगं कुर्मः वा ?वस्तुतः मैक्रोः केवलं कृते एव उपयुज्यन्तेसरलगणना, मैक्रो-तुलने तेषां जटिल-बृहत्-क्रियाणां कार्याणां च कृते न उपयुक्तम् हानि:
- प्रत्येकं समये मैक्रो इत्यस्य उपयोगः भवति तदा मैक्रो परिभाषासङ्केतस्य प्रतिलिपिः कार्यक्रमे निवेशिता भवति ।यावत् स्थूलः तुल्यकालिकरूपेण लघुः नास्ति, तावत् भवितुं शक्नोति
大幅度增加程序的长度
- मैक्रो इति
没法调试
इत्यस्य- मैक्रोः प्रकारस्वतन्त्राः सन्ति अर्थात् ।
不够严谨
- मैक्रोस् संचालनप्राथमिकतासमस्यां जनयितुं शक्नोति, येन कार्यक्रमः...
容易出错
परन्तु कदाचित्, मैक्रोस् तानि कार्याणि कर्तुं शक्नुवन्ति यत् फंक्शन्स् न शक्नुवन्ति
उदाहरणतया:
int* p = (int*)malloc(10 * sizeof * (int));
एवं लेखनं अस्माकं न रोचते malloc mallocमlloc कार्यं अतीव बोझिलम् अस्ति, अहं इच्छामि大小
तथा类型
स्थानं उद्घाटयितुं तत् पारयन्तु
Malloc(10, int);
किं कार्याणि एतत् कर्तुं शक्नुवन्ति ?न, यतःकार्याणि प्रकारान् पारयितुं न शक्नुवन्ति
तथा च मैक्रोस् तत् कर्तुं शक्नुवन्ति, यतः मैक्रोस् न कुर्वन्तिमा परीक्ष्यताम्भवतः मापदण्डाःप्रकारःइत्यस्य
#define Malloc(n, type) (type*)malloc(n * sizeof(type))
int main()
{
int* p = Malloc(10, int);
return 0;
}
मैक्रोस् तथा फंक्शन्स् इत्येतयोः तुलना : १.
गुणाः | # परिभाषयतु परिभाषयतुघङचइत्यस्मिन्ङमैक्रो परिभाषयतु | नियोग |
---|---|---|
कोड लम्बाई | प्रत्येकं वारं तस्य उपयोगः भवति चेत्, अत्यल्पं मैक्रों विहाय कार्यक्रमस्य दीर्घता महतीं वृद्धिं प्राप्स्यति । | फंक्शन् कोड् मूल्यं एकस्मिन् स्थाने दृश्यते, प्रत्येकं फंक्शन् इत्यस्य उपयोगः भवति चेत् तस्मिन् स्थाने स एव कोड् आह्वयते । |
निष्पादनवेगः | द्रुततरम् | तत्र function calls and returns (stack frames इत्यस्य उद्घाटनं) अतिरिक्तं ओवरहेड् अस्ति, अतः मन्दतरेभ्यः आरभ्यामः । |
संचालकः प्राधान्यम् | मैक्रो-मापदण्डानां मूल्याङ्कनं सर्वेषां परितः व्यञ्जनानां सन्दर्भे भवति यावत् कोष्ठकाः न समाविष्टाः भवन्ति, तावत् समीपस्थसञ्चालकानां प्राधान्यस्य अप्रत्याशितपरिणामाः भवितुम् अर्हन्ति अतः अधिककोष्ठकैः सह मैक्रो-लेखनं अनुशंसितम् | फंक्शन् पैरामीटर्स् केवलं एकवारं मूल्याङ्किताः भवन्ति यदा फंक्शन् आह्वयते, तस्य परिणाममूल्यं च फंक्शन् प्रति पारितं भवति, येन अभिव्यक्तिस्य मूल्याङ्कनफलं अधिकं पूर्वानुमानीयं भवति |
दुष्प्रभावयुक्ताः मापदण्डाः | मैक्रो मध्ये पैरामीटर्स् बहुषु स्थानेषु प्रतिस्थापिताः भवितुमर्हन्ति यदि मैक्रो इत्यस्य पैरामीटर्स् बहुवारं मूल्याङ्किताः भवन्ति तर्हि दुष्प्रभावैः सह पैरामीटर् मूल्याङ्कनं अप्रत्याशितफलं जनयितुं शक्नोति | पैरामीटर्स् पारयन्ते सति फंक्शन् पैरामीटर्स् केवलं एकवारं आह्वयन्ति, परिणामानां पूर्वानुमानं च सुकरं भवति । |
पैरामीटर प्रकार | मैक्रो इत्यस्य पैरामीटर्स् इत्यस्य प्रकारेण सह किमपि सम्बन्धः नास्ति यावत् पैरामीटर्स् इत्यस्य उपरि ऑपरेशनं वैधानिकं भवति तावत् सः कस्यापि पैरामीटर् प्रकारेण सह उपयोक्तुं शक्यते । | फंक्शन् इत्यस्य पैरामीटर्स् प्रकारसम्बद्धाः भवन्ति यदि पैरामीटर्स् भिन्नप्रकारस्य सन्ति तर्हि ते समानं कार्यं कुर्वन्ति चेदपि भिन्नाः फंक्शन्स् आवश्यकाः भवन्ति । |
त्रुटिनिवारणम् | मैक्रोस् त्रुटिनिवारणं कर्तुं असुविधाजनकाः सन्ति | कार्याणि पदे पदे त्रुटिनिवारणं कर्तुं शक्यन्ते |
पुनरावृत्तिः | मैक्रोस् पुनरावर्तनीयाः न भवितुम् अर्हन्ति | कार्याणि पुनरावर्तनीयानि भवितुम् अर्हन्ति |
किं तेषां लाभानाम् संयोजनस्य कोऽपि उपायः अस्ति ?
C++ इत्यस्मिन् प्रवर्ततेinline function inline inline इतिइत्यस्मिन्लइत्यस्मिन्ङ ——मैक्रो-फंक्शन्-योः लाभाः सन्ति
इदं मैक्रो इव शीघ्रं निष्पादयति परन्तु फंक्शन् इव प्रभावः भवति