C和C++裡面預處理結束時用換行符就行了。
2. 預處理類型
1. 預處理程序
按照ANSI標準的定義,預處理程序應該處理以下指令:
#if #ifdef #ifndef #else #elif
#endif
#define
#undef
#line
#error
#pragma
#include
顯然,上述所有的12個預處理指令都以符號#開始,,每條預處理指令必須獨佔一行。
2. #define
#define指令定義一個標識符和一個串(也就是字元集),在源程序中發現該標識符時,都用該串替換之。這種標識符稱為宏名字,相應的替換稱為宏代換。一般形式如下:
#define macro-name char-sequence
這種語句不用分號結尾。宏名字和串之間可以有多個空白符,但串開始後只能以新行終止。
例如:我們使用LEFT代表1,用RIGHT代表0,我們使用兩個#define指令:
#define LEFT 1
#define RIGHT 0
每當在源程序中遇到LEFT或RIGHT時,編譯程序都用1或0替換。
定義一個宏名字之後,可以在其他宏定義中使用,例如:
#define ONE 1
#define TWO ONE+ONE
#define THREE ONE+TWO
宏代換就是用相關的串替代標識符。因此,如果希望定義一條標准錯誤信息時,可以如下定義:
#define ERROR_MS 「Standard error on input \n」
如果一個串長於一行,可在行尾用反斜線」\」續行,如下:
#define LONG_STRING 「This is a very very long \
String that is used as an example」
3. #error
#error指令強制編譯程序停止編譯,它主要用於程序調試。#error指令的一般形式是:
#error error-message
注意,宏串error-message不用雙引號包圍。遇到#error指令時,錯誤信息被顯示,可能同時還顯示編譯程序作者預先定義的其他內容。
4. #include
程序中的#include指令要求編譯程序讀入另一個源文件。被讀入文件的名字必須用雙引號(「」)或一對尖括弧(<>)包圍,例如:
#include 「stdio.h」
#include 都使C編譯程序讀入並編譯頭文件以用於I/O系統庫函數。
包含文件中可以包含其他#include指令,稱為嵌套包含。允許的最大嵌套深度隨編譯器而變。
文件名被雙括弧或尖括弧包圍決定了對指定文件的搜索方式。文件名被尖括弧包圍時,搜索按編譯程序作者的定義進行,一般用於搜索某些專門放置包含文件的特殊目錄。當文件名被雙括弧包圍時,搜索按編譯程序實時的規定進行,一般搜索當前目錄。如未發現,再按尖括弧包圍時的辦法重新搜索一次。
通常,絕大多數程序員使用尖括弧包圍標準的頭文件,雙引號用於包圍與當前程序相關的文件名。
5. 條件編譯指令
若干編譯指令允許程序員有選擇的編譯程序源代碼的不同部分,這種過程稱為條件編譯。
5.1#if、#else、#elif #endif
條件編譯指令中最常用的或許是#if,#else,#elif和#endif。這些指令允許程序員根據常數表達式的結果有條件的包圍部分代碼。
#if的一般形式是:
#if constant-expression
Statement sequence
#endif
如#if後的常數表達式為真,則#if和#endif中間的代碼被編譯,否則忽略該代碼段。#endif標記#if塊的結束。
#else指令的作用與C語言的else相似,#if指令失敗時它可以作為備選指令。例如:
#include #define MAX 100
Int main(void)
{
#if MAX>99
printf(「Compiled for array greater than 99.\n」);
#else
printf(「Complied for small array.\n」);
#endif
return 0;
}
注意,#else既是標記#if塊的結束,也標記#else塊的開始。因為每個#if只能寫一個#endif匹配。
#elif指令的意思是「否則,如果」,為多重編譯選擇建立一條if-else-if(如果-否則-如果鏈)。如果#if表達式為真,該代碼塊被編譯,不測試其他#elif表達式。否則,序列中的下一塊被測試,如果成功則編譯之。一般形式如下:
#if expression
Statement sequence
#elif expression1
Statement sequence
#elif expression2
Statement sequence
.
.
.
#elif expression
Statement sequence
#endif
5.2#ifdef和#ifndef
條件編譯的另一個方法是使用編譯指令#ifdef和#ifndef,分別表示「如果已定義」和「如果未定義」。#ifdef的一般形式如下:
#ifdef macro-name
Statement sequence
#endif
如果macro-name原先已經被一個#define語句定義,則編譯其中的代碼塊。
#ifndef的一般形式是:
#ifndef macro-name
Statement sequence
#endif
如果macro-name當前未被#define語句定義,則編譯其中的代碼塊。
我認為,用這種,可以很方便的開啟/關閉整個程序的某項特定功能。
#ifdef和#ifndef都可以使用#else或#elif語句。
#inlucde #define T 10
Int main(void)
{
#ifdef t
Printf(「Hi T\n」);
#else
Printf(「Hi anyone\n」);
#endif
#ifndef M
Printf(「M Not Defined\n」);
#endif
Return 0;
}
6. #undef
#undef指令刪除前面定義的宏名字。也就是說,它「不定義」宏。一般形式為:
#undef macro-name
7. 使用defined
除#ifdef之外,還有另外一種確定是否定義宏名字的方法,即可以將#if指令與defined編譯時操作符一起使用。defined操作符的一般形式如下:
defined macro-name
如果macro-name是當前定義的,則表達式為真,否則為假。
例如,確定宏MY是否定義,可以使用下列兩種預處理命令之一:
#if defined MY
或
#ifdef MY
也可以在defined之前加上感嘆號」!」來反轉相應的條件。例如,只有在DEBUG未定義的情況下才編譯。
#if !defined DEBUG
Printf(「Final Version!\n」);
#endif
使用defined的一個原因是,它允許由#elif語句確定的宏名字存在。
8. #line
#line指令改變__LINE__和__FILE__的內容。__LINE__和__FILE__都是編譯程序中預定義的標識符。標識符__LINE__的內容是當前被編譯代碼行的行號,__FILE__的內容是當前被編譯源文件的文件名。#line的一般形式是:
#line number 「filename」
其中,number是正整數並變成__LINE__的新值;可選的「filename」是合法文件標識符並變成__FILE__的新值。#line主要用於調試和特殊應用。
9. #pragma
#pragma是編譯程序實現時定義的指令,它允許由此向編譯程序傳入各種指令。例如,一個編譯程序可能具有支持跟蹤程序執行的選項,此時可以用#pragma語句選擇該功能。編譯程序忽略其不支持的#pragma選項。#pragma提高C源程序對編譯程序的可移植性。
10. 預處理操作符#和##
有兩個預處理操作符:#和##,它們可以在#define中使用。
操作符#通常稱為字元串化的操作符,它把其後的串變成用雙引號包圍的串。例如:
#include #define mkstr(s) #s
int main(void)
{
Printf(mkstr(I like C));
Return 0;
}
預處理程序把以下的語句:
Printf(mkstr(I like C));
變成
Printf(「I like C」);
操作符##把兩個標記拼在一起,形成一個新標記。例如:
#include #define concat(a,a) a##b
int main(void)
{
Int xy = 10;
Printf(「%d」,concat(x,y));
Return 0;
}
預處理程序把以下語句:
Printf(「%d」,concat(x,y));
變成
Printf(「%d」,xy);
操作符#和##主要作用是允許預處理程序對付某些特殊情況,多數程序中並不需要。
11. 預定義宏
C規范了5個固有的預定義宏,它們是:
__LINE__
__FILE__
__DATE__
__TIME__
__STDC__
__LINE__和__FILE__包含正在編譯的程序的行號和文件名。
__DATE__和內容形如month/day/year(月/日/年)的串,代表源文件翻譯成目標碼的日期。
__TIME__中的串代表源代碼編譯成目標碼的時間,形如hour:minute:second(時:分:秒)
如果__STDC__的內容是十進制常數1,則表示編譯程序的實現符合標准C。
3. 預編譯命令行由什麼符號開頭
#include "stdio.h"
#define P 3
void *F(int x)/*定義一個無類型函數,它有返回值,只是返回的值是指向無類型數據的指針*/
void main(){printf("%d\n",(int)F(1+3));/*將無類型函數F返回的指針值通過(int)強制轉換為int型*/
還有幾個問題,
1.預處理命令行必須位於源文件的開頭是對是錯?為什麼?
對!
編譯器在編譯源代碼時都是從開頭到結尾依次讀取,自己定義的變數、宏等等都得放前面,這樣在編譯器在讀到它們時就作一個記錄;
在使用這些變數、宏時,編譯器會在記錄中去尋找,如果找不到就會報錯——此變數未被定義。
函數可以放在結尾(main()之後),但是必須在開頭作一個函數聲明(也叫函數原型)以使編譯器為它作記錄,以便以後使用它時可以在記錄中找到它。
函數也可以放在前面(main()之前),此時就不用再聲明了,編譯器在讀到它時也會作一個記錄。
總之,自己定義的東西都得先聲明後使用,否則使用時在記錄中會找不到它。
預處理命令也是自己定義的東西,同屬這一范疇。
2.為什麼在源文件的一行上不能有多條預處理命令?
每條C語句都有一個「;」作結尾,即使都放一行,編譯器都能分辨得出。
預處理命令並不以「#」作為結尾標記,放一行的話編譯器是無法分辨的,它會把此行作為一個語句處理
通常的語句最好都分行寫,否則程序量大時是不便排錯的。
3.若有下列說明和定義
union dt
date;
變數data所佔內存位元組數與成員c所佔位元組數相同,為什麼?
聯合體的長度是其最長成員(如double c)的長度。
聯合體在內存中的存儲形式:
聯合體所有成員a,b,c都是同一地址,也就是說他們共同佔用這一段內存。
以TC3.0為例,a占這一段內存的頭2個位元組,b占這一段內存的頭一個位元組,c占這一段內存的全部位元組(也就是頭4個位元組)
4.為什麼以下不對
char *sp;*sp="right!";
char s[10];s="right!";
一、進行字元串賦值時可以在定義時:直接在字元串定義後接「="right"」
如:char *sp="right";
或者 char s[10]="right";
二、也可以在非定義時,這時左值必須是左值必須是字元串指針變數。
如:sp="right!";
以下都是錯誤用法:
*sp="right!";//左值不是字元串指針變數
s="right!";//左值只是字元串指針 常量
1、如果說*a包含(x和\0),而*b包含(x和y),拿*a-*b會得出什麼結果,*a和*b都是char型變數的話
最終的表達式*a-*b中,a points to '\0',b points to 'y',so 表達式*a-*b代表的是'\0'-'y',結果是-121(y的ASCII是121)
point(char*p)
main()
{
char b[4]={'a','b','c','d'),*p=b;
point(p); printf("%c\n",*p);
}
A.a B.b C.c D.d
選哪個?為什麼?
選D,p最初是首地址b,然後p是b+3,此時*p相當*(b+3)、b[3].
2號問題:
main()
,,,},i,j;
for(i=0;i<4;i++)
{for (j=0;j<i,j++)
printf("%4c",' ');/*原題就是'和'之間只有個空格,我也不清楚是怎麼回事*/
for(j=__;j<4;j++)
printf(%4d",num[i][j]);
printf("\n");
}
}
printf("%4c",' '); 其中的' '其實是一個空格字元常量,這個同'a','b','c'等字元常量是一樣的。
這個語句中%4c是指要讀取一個字元(這個字元就是後面的空格字元常量' ')並輸出,這個字元在顯示器上應該佔4格。所以此句的功能是輸出4個空格(空格也是屬於字元)。
你改成printf("%4c",'a');printf("%4c",'b');試下,它是輸出3個空格和一個字元。
printf("%8c",' ');是輸出8個空格,這個比printf(" ");來實現輸出8個字元來得方便。
若要按下列形式輸出數組右上半三角(什麼玩意?)。
1 2 3 4 i=0,j=i,那麼j可以是0,1,2,3
6 7 8 i=1,j=i,那麼j可以是1,2,3
11 12 i=2,j=i,那麼j可以是2,3
16 i=3,j=i,那麼j可以是3
則下劃線處應填入的是?為什麼?(B)
A.i-1 B.i
C.i+1 D.4-i
3號問題:
程序中若有下列說明和定義語句:
char fun(char*);
main()
{
char *s="one",a[5]=,(*fl)()=fun,ch;
......
}
下列選項中對函數的正確調用語句是?為什麼?
A.(*fl)(a);
B.*fl(*s);
C.fun(&a);
D.ch=*fl( s);
選擇A,根據定義char fun(char*),形參必須是一個字元指針,"a","s"才是字元指針(char pointer),而"*s" is char variable,"&a" is invalid.所以排除B、C
只有fun、*fl才是函數入口地址.
B.*fl(*s);相當於*(fl(*s)),錯誤,指針運算符只能針對指針運算,fl(*s)得到的是int,不是指針,下同。故排除B、D.
D.*fl( s);相當於*(fl( s));
4號問題
#define S(x) 4*x*x+1
main()
{
int i=6,j=8;
printf("%d",S(i+j));
getchar();
}
這個函數的輸出結果是多少?怎麼得的?
得到81.
因為S(i+j)經過預編譯用i+j替換x後,它被展開為4*i+j*i+j+1。即(4*6+8*6+8+1)
你應該這樣改:
#define S(x) 4*(x)*(x)+1
或者 printf("%d",S((i+j)));即將i+j用括弧括起來(i+j),這樣就在替換時用(i+j)替換x
4. include指的是什麼
include是一個計算機專業術語,它指C/C++中包含頭文件命令,用於將指定頭文件嵌入源文件中。二指include 指令,在JSP中包含一個靜態的文件,同時解析這個文件中的JSP語句。三指PHP語句。
(4)預處理命令用什麼結尾擴展閱讀:
#include <stdio.h>
#include<stdio.h>是在程序編譯之前要處理的內容,稱為編譯預處理命令。編譯預處理命令還有很多,它們都以「#」開頭,並且不用分號結尾,所以是c語言的程序語句。
在程序中用到系統提供的標准函數庫中的輸入輸出函數時,應在程序的開頭寫上一行:#include"stdio.h"或者是#include<stdio.h>,這樣才能調用庫函數。二者主要在於查找效率上有差別,#include<stdio.h>一般用包含系統文件,它是查找先從系統目錄查找開始查找;#include "蘆慶stdio.h"一般用包含項目文件,它是查找先從項目目錄查找開始查找。缺尺
在編寫C語言中,伏嘩高常用到printf()和scanf()函數,他們就是stdio.h中的兩個標准輸入輸出函數,所以編程語句中如果要用到此兩個函數就一定要在頭文件中加入#include<stdio.h>。
5. c語言 選擇題,選正確的,選好了給個說明
A)預處理命令行必須位於源文件的開頭
B)在源文件的一悉兄行上可以有多條預處理命令
C)宏名必須用大寫字母表示
D)宏替換不佔用程序的運行時間
答案:D
評析:通常,預處理命令位於源文件的開頭,也可以寫在函數與函數之間;不能在一行上寫多條預處理命令:宏名一般習慣用大寫字母表示,以便與變數名相區別,但這並非規定,也可睜判襲用小寫字母。
預處理命令是以#號開頭的代碼行,每一條預處理命令必須單獨佔用一行,由於不是C的語句,因此在結尾不能有分號「;」。
宏被定義後,其作用域一般為定義它的文件,通常#define命令寫在文件的開頭,但這也並非規定,實際上宏沖伏定義可以出現在程序的任何地方,但必須位於引用之前。
6. 在C語言中,什麼情況下子函數的結尾要添加「;」
函數結尾是不用加「;」的,如樓上所說,只有聲明的時候需要。
至於這邊三個函數,其實最後「;」是多餘的,編譯的時候,編譯器讀到「}」匹配後就知道這個函數結束,而後面的「;」,編譯器會認為是一個空語句,相當於什麼也沒干,是不會報錯的,運行時也不會出錯。
「;」一般用於一個語句的語句的結尾,在函數的結尾、預處理嘩羨命令的結尾都是不需要加的,一般容易忘的是,亂漏拍在類和搜搭結構體定義的結尾要加「;」
7. C中的temp是什麼意思
temp是一個變數名,變數是以某標識符為名字,其值塌嘩可以改變的量。
變數temp在此程序中起中間交換的作用。
比如a和b交換的時候,先將a的值賦予temp,再將b的值賦予a,此時temp的值就是原先a的值,此刻就可以將temp賦予給b。a和b就完成交換了。
(7)預處理命令用什麼結尾擴展閱讀虧衫盯:
C語言需要說明的是:
1、一個C語言源程序可以由一個或多個源文件組成。
2、每個源文件可由一個或多個函銷和數組成。
3、一個源程序不論由多少個文件組成,都有一個且只能有一個main函數,即主函數。是整個程序的入口。
4、源程序中可以有預處理命令(包括include 命令,ifdef、ifndef命令、define命令),預處理命令通常應放在源文件或源程序的最前面。
5、每一個說明,每一個語句都必須以分號結尾。但預處理命令,函數頭和花括弧「}」之後不能加分號。結構體、聯合體、枚舉型的聲明的「}」後要加「 ;」。
6、標識符,關鍵字之間必須至少加一個空格以示間隔。若已有明顯的間隔符,也可不再加空格來間隔。
網路-c語言
8. c語言源程序的擴展名是什麼
c語言源程序的擴展名是:「.c」。由C語言構成的指令序列稱為C源程序,源程序文件的後綴為「.c」。註:在絕大多數的操作系統里,C源代碼文件的後綴的大小寫無所謂,如「index.C」和「index.c」指的是同一個文件;但老練的程序員通常使用小寫。
對於計算機語言來說,其源代碼文件的命名會有一個特定的後綴。如C++的源代碼文件的後綴是「.cpp」;Python的源代碼文件的後綴是「.py」;而C的源代碼文件的後綴則是「.C」。
源程序的結構特點
1、一個C語言源程序可以由一個或多個源文件組成。
2、每個源文件可由一個或多個函數組成。
3、一個源程序不論由多少個文件組成,都有一個且只能有一個main函數,即主函數。
4、源程序中可以有預處理命令(include 命令僅為其中的一種),預處理命令通常應放在源文件或源程序的最前面。
5、每一個說明,每一個語句都必須以分號結尾。但預處理命令,函數頭和花括弧「}」之後不能加分號。
6、標識符,關鍵字之間必須至少加一個空格以示間隔。若已有明顯的間隔符,也可不再加空格來間隔。
9. 預處理命令 #elif 只能用在 #if 後面嗎
#elif B/冊族/估計你寫慧姿如錯了,應該是#elseif B;這個需要配對使前啟用的,elseif也可以不出現,就像一樓寫的那樣