प्रौद्योगिकी साझेदारी

[C Language] - पूर्वसंसाधनस्य विस्तृतव्याख्या (भागः १) १.

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

1. पूर्वनिर्धारितचिह्नानि

C भाषायां केचन सेटिङ्ग्स् सन्तिपूर्वनिर्धारितचिह्नानि, प्रत्यक्षतया उपयोक्तुं शक्यते, पूर्वनिर्धारितचिह्नानि सन्ति在预处理期间处理的

__FILE__    //进行编译的源文件
__LINE__	//文件当前的行号
__DATE__	//文件被编译日期
__TIME__	//文件被编译那一瞬的时间
__STDC__	//如果编译器遵循ANSI C(标准C),其值为1,否则未定义(报错)
  • 1
  • 2
  • 3
  • 4
  • 5

  
उदाहरण:

#include<stdio.h>

int main()
{
	printf("%sn", __FILE__);
	printf("%dn", __LINE__);
	printf("%sn", __DATE__);
	printf("%sn", __TIME__);
	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

  
संचालन परिणाम : १.

अत्र चित्रविवरणं सम्मिलितं कुर्वन्तु

अहम् अत्र उल्लेखयितुम् इच्छामि यत् VS ANSI C (standard C) इत्यस्य पूर्णतया समर्थनं न करोति; gcc gccसीसी ANSI C (मानक C) समर्थयति
  

द्वि,# परिभाषयतु परिभाषयतुइत्यस्मिन्‌ नित्यानि (चिह्नानि) परिभाषयन्तु .

मूलभूतवाक्यविन्यासः १.

# define name stuff
  • 1

उदाहरणतया:

#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__ )
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • द्वितीयं वाक्यं आलस्यम्, किमर्थम् ?
  • तृतीयं वाक्यम् हि हिवा परिपत्रम्初始化、判断、调整都可以省略, किन्तु न्यायस्य लोपः चेत् न्यायस्थितिः सर्वदा सत्या इत्यर्थःअनन्त पाशः
  • चतुर्थे क्रीडने एतत् न कर्तुं श्रेयस्करम्, सहजतया कष्टं जनयितुं शक्नोति।
  • पञ्चमं वाक्यम्रेखा निरन्तरता वर्णशाखाकरणानन्तरं समस्यानां निवारणार्थम् अस्ति转义पृष्ठभागः回车符 , येन वाहनप्रत्यागमनं न पुनः वाहनप्रत्यागमनं भवति।रेखानिरन्तरतावर्णस्य अनन्तरं किमपि न भवितुम् अर्हति, नुदतु“” केवलं Enter नुदन्तु, अन्यथा निरन्तरता निम्नलिखित कोडपङ्क्तिः न भविष्यति ।

  
अधुना समस्या आगच्छति : प्रयोगः # . परिभाषयतु परिभाषयतुइत्यस्मिन्‌ परिचयकं परिभाषयन्ते सति अन्ते योजयितव्यं वा?

उदाहरणतया:

#define MAX 1000
#define MAX 1000;

int main()
{
	int n = MAX;
	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

अत्र चित्रविवरणं सम्मिलितं कुर्वन्तु

उपर्युक्तः कोडः प्लस्, इदं केवलं किञ्चित् अनावश्यकं दृश्यते, परन्तु कार्यक्रमस्य चालने तस्य कोऽपि प्रभावः नास्ति ।
योजयति इव अथवा मा योजयतु सर्वं सम्यक् भविष्यति ?
किं तत्त्वतः एवम् अस्ति ?
  
निम्नलिखितम् उदाहरणं पश्यामः ।

//例一
int main()
{
	printf("%dn", MAX);
	return 0;
}

//例二
int mian()
{
	int max = 0;
	if (1)
		max = MAX;
	else
		max = 1;
	return 0
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

प्रतिस्थापनानन्तरं : १.

printf("%dn", 1000;);
  • 1

मुद्रण1000;किम् इत्यर्थः ?

if (1)
	max = 1000;
	;
else
	max = 1;
  • 1
  • 2
  • 3
  • 4
  • 5

अन्यथासे कस्य मेलनं कर्तव्यम् ?
  
पश्यन्तु, अस्मिन् किमपि दोषः अस्ति, अतःउपयुञ्जताम्‌ # परिभाषयतु परिभाषयतुइत्यस्मिन्‌ सूचकं परिभाषयन्ते सति तदनन्तरं न योजयन्तु

  

त्रयः,# परिभाषयतु परिभाषयतुइत्यस्मिन्‌ मैक्रो परिभाषयतु

  # परिभाषयतु परिभाषयतुइत्यस्मिन्‌ तन्त्रे एकः प्रावधानः अन्तर्भवति,允许把参数替换到文本中, एतत् कार्यान्वयनम् प्रायः उच्यतेमैक्रो ( मार्को ) (मार्को) .र्कोवा मैक्रो परिभाषयतु ( definemacro ) (macro परिभाषित करें) .इत्यस्मिन्‌क्रो
उपरिष्टात् मैक्रोस् तथा मैक्रो परिभाषापरिचयकानां मध्ये अन्तरं अस्ति :मैक्रो इत्यस्य मापदण्डाः सन्ति
  
अत्र मैक्रो कथं घोषितं भवति :

#define name(parament - list) stuff
  • 1

तेषु एकः परमेण्ट् परमेन्ट्पृएकःअस्मि - सूचीसूचीअहम्‌(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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

  
संचालन परिणाम : १.

अत्र चित्रविवरणं सम्मिलितं कुर्वन्तु

यथा भवन्तः पश्यन्ति, ५ इत्यस्य वर्गः सम्यक् गण्यते

परन्तु वस्तुतः उपर्युक्तसङ्केतस्य समस्या अस्ति कृपया निम्नलिखितसङ्केतखण्डं पश्यन्तु ।

int a = 5;
printf("%dn", SQUARE(a + 1));
  • 1
  • 2

  
संचालन परिणाम : १.

अत्र चित्रविवरणं सम्मिलितं कुर्वन्तु

किमर्थमिदम् ? ५+१ इत्यस्य परिणामः ३६, ६ च भवति ∗ * ६ भवितुमर्हति ३६ कथं भवता ११ प्राप्तम् ?

समस्या मैक्रोस् इत्यस्य अस्ति इति वयं जानीमः宏是直接替换, तर्हि उपर्युक्तसङ्केतस्य प्रत्यक्षप्रतिस्थापनस्य परिणामः अस्ति :

printf("%dn", a+1*a+1);
  • 1

५ + ६ + १, परिणामः स्वाभाविकतया ११

मैक्रो परिभाषायाः उभयतः कोष्ठकं योजयित्वा वयं सहजतया एतस्याः समस्यायाः समाधानं कर्तुं शक्नुमः ।

#define SQUARE(x) (x)*(x)
  • 1

अतः अस्याः परिभाषायाः कोऽपि समस्या नास्ति वा ?निम्नलिखित स्थूलपरिभाषां अवलोकयामः ।

#define DOUBLE(X) (X)+(X)
  • 1

पूर्वसमस्यां परिहरितुं परिभाषायां वयं कोष्ठकं प्रयुक्तवन्तः, परन्तु एतत् मैक्रो नूतनानि त्रुटयः जनयितुं शक्नोति ।

int a = 5;
printf("%dn", 10 * DOUBLE(a));
  • 1
  • 2

  
संचालन परिणाम : १.

अत्र चित्रविवरणं सम्मिलितं कुर्वन्तु

आउटपुट् परिणामः १०० न अपितु ५५.कारणं उपर्युक्तस्य सदृशम् अस्ति प्राथमिकता प्रश्न
  
समाधानं:

#define DOUBLE(X) ((X)+(X))
  • 1

सारांशेन मैक्रोस् इत्यस्य उपयोगं कुर्वन्कोष्ठकं कदापि न स्कम्पं कुर्वन्तुमैक्रोस् इत्यस्य उपयोगं कुर्वन् पैरामीटर्स् अथवा समीपस्थेषु ऑपरेटर् मध्ये ऑपरेटर् मध्ये अप्रत्याशितपरस्परक्रियाः परिहरितुं ।

  

4. दुष्प्रभावयुक्ताः स्थूलमापदण्डाः

यदा मैक्रो पैरामीटर् एकवारादधिकं मैक्रो परिभाषायां दृश्यते, यदि पैरामीटर् अस्तिदुष्प्रभावः, तर्हि भवन्तः एतस्य मैक्रो इत्यस्य उपयोगं कुर्वन् संकटे भवितुम् अर्हन्ति, यस्य परिणामः भवति不可预测 इति परिणामः । अभिव्यञ्जनस्य मूल्याङ्कनसमये दुष्प्रभावाः स्थायिप्रभावाः भवन्ति ।
  
उदाहरणतया:

x + 1; //不带副作用
x++//带副作用
  • 1
  • 2

निम्नलिखित 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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

  
संचालन परिणाम : १.

अत्र चित्रविवरणं सम्मिलितं कुर्वन्तु

किमर्थमिदम् ?मिलित्वा तस्य विश्लेषणं कुर्मः

z = ((X++) > (y++) ? (x++) : (y++))
  • 1
  • प्रथमं निर्णयं कुरुत- १. xxx++ सह य्य्य्++ न्यायः, उत्तरपदत्वात् ++, न्याये xxx इति ५, ९. य्य्य् इति ८, ८ &gt; ५
  • न्यायं कृत्वा xxx इति ६, ९. य्य्य् कृते ९
  • ततः निष्पादयन्तु य्य्य् ++, उत्तरनियतत्वात् ++ परिणामः ९
  • ततः अग्रे गच्छतु य्य्य् स्वयम्-वृद्धिं कुर्वन्तु, . य्य्य् अन्तिमः परिणामः १० भवति

वयं करिष्यामः xxx तथा य्य्य् यदा मैक्रो मध्ये पारितं तदा परिणामाः परिवर्तिताः, विशेषतः य्य्य्, परिवर्तनद्वयानन्तरं भवता उक्तं यत् इदं न भयंकरं अस्ति
यदा दुष्प्रभावयुक्तः पैरामीटर् मैक्रो-मध्ये पारितः भवति, तथा च मैक्रो-मध्ये एकवारादधिकं पैरामीटर् दृश्यते तदा पैरामीटर्-पार्श्वप्रभावः अपि एकवारादधिकं भवति
  

5. स्थूलप्रतिस्थापनस्य नियमाः

कार्यक्रमे विस्तारं कुरुत # . परिभाषयतु परिभाषयतुइत्यस्मिन्‌ चिह्नानि, मैक्रो च परिभाषयन्ते सति अनेकानि सोपानानि प्रवृत्तानि सन्ति

  • यदा मैक्रो आह्वयति तदा प्रथमं参数进行检查, पश्यन्तु तस्मिन् # . परिभाषयतु परिभाषयतुइत्यस्मिन्‌ विवक्षितम्标识符 .यदि एवम् तर्हि प्रथमं प्रतिस्थाप्यन्ते
  • प्रतिस्थापनपाठः अनुवर्तते被插入कार्यक्रमे मूलस्थानं प्रति, यत्र मैक्रो पैरामीटर् नामानि तेषां मूल्यैः प्रतिस्थापितानि सन्ति
#define MAX(a,b) ((a) > (b) ? (a):(b))
#define M 10

int main()
{
	int x = 5;
	int z = MAX(x, M);
	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • MAX ( x , M ) MAX(x, M) 1 .एकःX(x,) मध्यं एम.एम प्रथमं १० इत्यनेन प्रतिस्थापितं भवति, १० मूले च निवेश्यते एम.एम स्थानीय
  • अन्ते पुनः परिणामानां स्कैनिङ्गं भवति यत् तेषु # परिभाषयतु परिभाषयतुइत्यस्मिन्‌ परिभाषितं चिह्नं यदि एवम् अस्ति तर्हि उपर्युक्तं प्रक्रियां पुनः कुर्वन्तु

उपर्युक्तसङ्केते MAX अपि # 1000 इत्यनेन प्रतिनिधित्वं भवति । परिभाषयतु परिभाषयतुइत्यस्मिन्‌ विवक्षितम्मैक्रो .अन्तिमे निरीक्षणे तस्य पैरामीटर् M प्रतिस्थापितम् अस्ति अस्मिन् समये प्रतिस्थापनस्य समयः अस्ति ।
   अधिकतम ( x , 10 ) अधिकतम(x, 10) .एकःX(x,10) इति प्रतिस्थाप्यते ( ( x ) &gt; ( 10 ) ((x) &gt; (10) .((x)>(10) ? ? ? ( x ) : ( 10 ) ) (x):(10)) .(x):(10))
  
निश्चयेन,宏里面嵌套宏तत् अपि सुष्ठु अस्ति

MAX(x, MAX(2, 3))
  • 1

अस्मिन् समये प्रथमं पैरामीटर् मध्ये मैक्रो प्रतिस्थापयन्तु, ततः सम्पूर्णं मैक्रो प्रतिस्थापयन्तु
किन्तु एतत् द्रष्टव्यम्不是递归, यत् केवलं एकं मैक्रो अस्ति यत् अन्यस्य मैक्रो इत्यस्य तर्करूपेण कार्यं करोति ।递归是宏内部又调用了宏本身
अपि च, यदा पूर्वसंसाधकः # . परिभाषयतु परिभाषयतुइत्यस्मिन्‌ प्रतीकं परिभाषयन्ते सति ।स्ट्रिंग् स्थिरांकानाम् सामग्रीः न अन्वेषिता भवति
तस्य किम् अर्थः ?केवलं चेस्टनट् ददातु तर्हि भवन्तः अवगमिष्यन्ति।

#define M 10

int main()
{
	int x = 5;
	int z = MAX(x, MAX(2, 3));
	printf("M = %d", x);
	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

उपर्युक्ते संहितायांprintf("M = %d", x);मध्यं एम.एम 10 इत्यनेन प्रतिस्थाप्यते न भविष्यति

  

6. मैक्रोस् तथा फंक्शन्स् इत्येतयोः मध्ये तुलना

उपर्युक्तस्य मैक्रो इत्यस्य उपयोगेन द्वयोः सङ्ख्यायोः बृहत्तरं मूल्यं ज्ञातुं शक्यते यत् वयं तत् पूर्णतया फंक्शन् रूपेण लिखितुं शक्नुमः ।

int Max(int x, int y)
{
	return x > y ? x : y;
}
  • 1
  • 2
  • 3
  • 4

ते सर्वे समानं कार्यं साधयन्ति इति वयं ज्ञातवन्तः।परन्तु "द्वयोः सङ्ख्यायोः बृहत्तरं अन्वेष्टुम्" इति कार्याय, मैक्रो लेखनं करिष्यति更有优势केचन
  
तत्र कारणद्वयम्- १.

  • प्रयुक्ता इति调用函数तथा函数返回इत्यस्यकोडयथार्थतः एतां लघुगणनां (फंक्शन् आह्वयति समये) कर्तुं अपेक्षया अधिकं समयं गृह्णीयात्स्टैक फ्रेम रचयन्तु ).अतः मैक्रो रेशियो फंक्शन् प्रोग्राम् मध्ये अस्ति规模तथा速度पूर्वस्मात् अपि श्रेष्ठम्
  • अतः अधिकं महत्त्वपूर्णम्函数的参数必须声明类型 , येन समुचितप्रकारस्य व्यञ्जनेषु एव कार्यस्य उपयोगः भवति ।तद्विपरीतम्, एतत् मैक्रो बहुविधेषु प्रयोक्तुं शक्यते : पूर्णाङ्कः, दीर्घपूर्णाङ्कः, प्लवमानबिन्दुः इत्यादयः उपयोक्तुं शक्यन्ते
    > तुलनां कर्तुं ।मैक्रो इत्यस्य मापदण्डाः सन्तिस्वतन्त्र इति टङ्कयन्तुइत्यस्य

भविष्ये वयं सर्वदा मैक्रो-इत्यस्य उपयोगं कुर्मः वा ?वस्तुतः मैक्रोः केवलं कृते एव उपयुज्यन्तेसरलगणना, मैक्रो-तुलने तेषां जटिल-बृहत्-क्रियाणां कार्याणां च कृते न उपयुक्तम् हानि

  1. प्रत्येकं समये मैक्रो इत्यस्य उपयोगः भवति तदा मैक्रो परिभाषासङ्केतस्य प्रतिलिपिः कार्यक्रमे निवेशिता भवति ।यावत् स्थूलः तुल्यकालिकरूपेण लघुः नास्ति, तावत् भवितुं शक्नोति大幅度增加程序的长度
  2. मैक्रो इति没法调试इत्यस्य
  3. मैक्रोः प्रकारस्वतन्त्राः सन्ति अर्थात् ।不够严谨
  4. मैक्रोस् संचालनप्राथमिकतासमस्यां जनयितुं शक्नोति, येन कार्यक्रमः...容易出错

परन्तु कदाचित्, मैक्रोस् तानि कार्याणि कर्तुं शक्नुवन्ति यत् फंक्शन्स् न शक्नुवन्ति
  
उदाहरणतया:

int* p = (int*)malloc(10 * sizeof * (int));
  • 1

एवं लेखनं अस्माकं न रोचते malloc malloclloc कार्यं अतीव बोझिलम् अस्ति, अहं इच्छामि大小तथा类型स्थानं उद्घाटयितुं तत् पारयन्तु

Malloc(10, int);
  • 1

किं कार्याणि एतत् कर्तुं शक्नुवन्ति ?न, यतःकार्याणि प्रकारान् पारयितुं न शक्नुवन्ति
तथा च मैक्रोस् तत् कर्तुं शक्नुवन्ति, यतः मैक्रोस् न कुर्वन्तिमा परीक्ष्यताम्भवतः मापदण्डाःप्रकारःइत्यस्य

#define Malloc(n, type) (type*)malloc(n * sizeof(type))

int main()
{
	int* p = Malloc(10, int);
	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

  
मैक्रोस् तथा फंक्शन्स् इत्येतयोः तुलना : १.

गुणाः# परिभाषयतु परिभाषयतुइत्यस्मिन्‌मैक्रो परिभाषयतुनियोग
कोड लम्बाईप्रत्येकं वारं तस्य उपयोगः भवति चेत्, अत्यल्पं मैक्रों विहाय कार्यक्रमस्य दीर्घता महतीं वृद्धिं प्राप्स्यति ।फंक्शन् कोड् मूल्यं एकस्मिन् स्थाने दृश्यते, प्रत्येकं फंक्शन् इत्यस्य उपयोगः भवति चेत् तस्मिन् स्थाने स एव कोड् आह्वयते ।
निष्पादनवेगःद्रुततरम्तत्र function calls and returns (stack frames इत्यस्य उद्घाटनं) अतिरिक्तं ओवरहेड् अस्ति, अतः मन्दतरेभ्यः आरभ्यामः ।
संचालकः प्राधान्यम्मैक्रो-मापदण्डानां मूल्याङ्कनं सर्वेषां परितः व्यञ्जनानां सन्दर्भे भवति यावत् कोष्ठकाः न समाविष्टाः भवन्ति, तावत् समीपस्थसञ्चालकानां प्राधान्यस्य अप्रत्याशितपरिणामाः भवितुम् अर्हन्ति अतः अधिककोष्ठकैः सह मैक्रो-लेखनं अनुशंसितम्फंक्शन् पैरामीटर्स् केवलं एकवारं मूल्याङ्किताः भवन्ति यदा फंक्शन् आह्वयते, तस्य परिणाममूल्यं च फंक्शन् प्रति पारितं भवति, येन अभिव्यक्तिस्य मूल्याङ्कनफलं अधिकं पूर्वानुमानीयं भवति
दुष्प्रभावयुक्ताः मापदण्डाःमैक्रो मध्ये पैरामीटर्स् बहुषु स्थानेषु प्रतिस्थापिताः भवितुमर्हन्ति यदि मैक्रो इत्यस्य पैरामीटर्स् बहुवारं मूल्याङ्किताः भवन्ति तर्हि दुष्प्रभावैः सह पैरामीटर् मूल्याङ्कनं अप्रत्याशितफलं जनयितुं शक्नोतिपैरामीटर्स् पारयन्ते सति फंक्शन् पैरामीटर्स् केवलं एकवारं आह्वयन्ति, परिणामानां पूर्वानुमानं च सुकरं भवति ।
पैरामीटर प्रकारमैक्रो इत्यस्य पैरामीटर्स् इत्यस्य प्रकारेण सह किमपि सम्बन्धः नास्ति यावत् पैरामीटर्स् इत्यस्य उपरि ऑपरेशनं वैधानिकं भवति तावत् सः कस्यापि पैरामीटर् प्रकारेण सह उपयोक्तुं शक्यते ।फंक्शन् इत्यस्य पैरामीटर्स् प्रकारसम्बद्धाः भवन्ति यदि पैरामीटर्स् भिन्नप्रकारस्य सन्ति तर्हि ते समानं कार्यं कुर्वन्ति चेदपि भिन्नाः फंक्शन्स् आवश्यकाः भवन्ति ।
त्रुटिनिवारणम्मैक्रोस् त्रुटिनिवारणं कर्तुं असुविधाजनकाः सन्तिकार्याणि पदे पदे त्रुटिनिवारणं कर्तुं शक्यन्ते
पुनरावृत्तिःमैक्रोस् पुनरावर्तनीयाः न भवितुम् अर्हन्तिकार्याणि पुनरावर्तनीयानि भवितुम् अर्हन्ति

किं तेषां लाभानाम् संयोजनस्य कोऽपि उपायः अस्ति ?
C++ इत्यस्मिन् प्रवर्ततेinline function inline inline इतिइत्यस्मिन्‌इत्यस्मिन्‌ ——मैक्रो-फंक्शन्-योः लाभाः सन्ति
इदं मैक्रो इव शीघ्रं निष्पादयति परन्तु फंक्शन् इव प्रभावः भवति