嵌入式編程:由?C語(yǔ)言到?C
由C到C
OOP第一課
-
C語(yǔ)言的局限
-
C 的特點(diǎn)
-
C 的程序特征
-
C 程序的結(jié)構(gòu)特性
-
C 程序的編輯、編譯和運(yùn)行
-
?C 對(duì)C的補(bǔ)充
C 的特點(diǎn)
C 繼承了C的優(yōu)點(diǎn),并有自己的特點(diǎn),主要有:
C 的程序特征
例1.1 輸出一行字符:“This is a C program.”。
using namespace std; //使用命名空間std
int main( )
{
cout<<″This is a C program.″;
return 0;
}
-
用main代表“主函數(shù)”的名字。每一個(gè)C 程序都必須有一個(gè) main 函數(shù)。main前面的int的作用是聲明函數(shù)的類(lèi)型為整型。程序第6行的作用是向操作系統(tǒng)返回一個(gè)零值。如果程序不能正常執(zhí)行,則會(huì)自動(dòng)向操作系統(tǒng)返回一個(gè)非零值,一般為-1。
-
函數(shù)體是由大括號(hào){}括起來(lái)的。本例中主函數(shù)內(nèi)只有一個(gè)以cout開(kāi)頭的語(yǔ)句。注意C 所有語(yǔ)句最后都應(yīng)當(dāng)有一個(gè)分號(hào)。
-
再看程序的第1行“#include
-
”,這不是Cpp的語(yǔ)句,而是Cpp的一個(gè)預(yù)處理命令,它以“#”開(kāi)頭以與Cpp語(yǔ)句相區(qū)別,行的末尾沒(méi)有分號(hào)。
-
#include是一個(gè)“包含命令”,它的作用是將文件iostream的內(nèi)容包含到該命令所在的程序文件中,代替該命令行。文件iostream的作用是向程序提供輸入或輸出時(shí)所需要的一些信息。
-
iostream是i-o-stream3個(gè)詞的組合,從它的形式就可以知道它代表“輸入輸出流”的意思,由于這類(lèi)文件都放在程序單元的開(kāi)頭,所以稱為“頭文件” (head file)。在程序進(jìn)行編譯時(shí),先對(duì)所有的預(yù)處理命令進(jìn)行處理,將頭文件的具體內(nèi)容代替#include命令行,然后再對(duì)該程序單元進(jìn)行整體編譯。
-
程序的第2行“using namespace std;”的意思是“使用命名空間std”。Cpp標(biāo)準(zhǔn)庫(kù)中的類(lèi)和函數(shù)是在命名空間std中聲明的,因此程序中如果需要用到Cpp標(biāo)準(zhǔn)庫(kù)(此時(shí)就需要用#include命令行),就需要用“using namespace std;”作聲明,表示要用到命名空間std中的內(nèi)容。
-
在初學(xué)C 時(shí),對(duì)本程序中的第1,2行可以不必深究,只需知道:如果程序有輸入或輸出時(shí),必須使用“#include
-
”命令以提供必要的信息,同時(shí)要用“using namespace std;”,使程序能夠使用這些信息,否則程序編譯時(shí)將出錯(cuò)。
例1.2 求a和b兩個(gè)數(shù)之和
#include //預(yù)處理命令
using namespace std; //使用命名空間std
int main( ) //主函數(shù)首部
{ //函數(shù)體開(kāi)始
int a,b,sum; //定義變量
cin>>a>>b; //輸入語(yǔ)句
sum=a b; //賦值語(yǔ)句
cout<<″a b=″<
return 0; //如程序正常結(jié)束,向操作系統(tǒng)返回一個(gè)零值
} //函數(shù)結(jié)束
例1.3 給兩個(gè)數(shù)x和y, 求兩數(shù)中的大者
using namespace std;
int max(int x,int y) //定義max函數(shù),函數(shù)值為整型,形式參數(shù)x, y為整型
{ //max函數(shù)體開(kāi)始
int z; //變量聲明,定義本函數(shù)中用到的變量z為整型
if(x>y) z=x; //if語(yǔ)句,如果x>y, 則將x的值賦給z
else z=y; //否則,將y的值賦給z
return(z); //將z的值返回,通過(guò)max帶回調(diào)用處
} //max函數(shù)結(jié)束
int main( ) //主函數(shù)
{ //主函數(shù)體開(kāi)始
int a,b,m; //變量聲明
cin>>a>>b; //輸入變量a和b的值
m=max(a,b); //調(diào)用max函數(shù),將得到的值賦給m
cout<<″max=″<
return 0; //如程序正常結(jié)束,向操作系統(tǒng)返回一個(gè)零值
} //主函數(shù)結(jié)束
-
18 25 ↙ (輸入18和25給a和b)
-
max=25 (輸出m的值)
using namespace std;
int max(int x,int y); //對(duì)max函數(shù)作聲明
int main( )
{
int a,b,c;
cin>>a>>b;
c=max(a,b); //調(diào)用max函數(shù)例1.3 給兩個(gè)數(shù)x和y, 求兩數(shù)中的大者。
cout<<″max=″<
return 0;
}
int max(int x,int y) //定義max函數(shù)
{
int z;
if(x>y) z=x;
else z=y;
return(z);
}
C 程序的結(jié)構(gòu)特性
一個(gè)面向?qū)ο蟮腃 程序一般由類(lèi)的聲明和類(lèi)的使用兩大部分組成。
典型的C 程序結(jié)構(gòu)
//類(lèi)的聲明部分
class A{
int x,y,z;
……
fun( ){……}
……
};
//類(lèi)的使用部分
int main()
{
A a;
……
a.fun();
return 0;
}
C++程序的編輯、編譯和運(yùn)行
C 源程序文件的擴(kuò)展名為.CPP
C 對(duì)C的補(bǔ)充
1、注釋與續(xù)行
-
注釋符:“/*”和“*/” 或“//” 。
例如:
X = y z; //This is a comment
-
續(xù)行符:“\”(反斜杠)。作用是當(dāng)一個(gè)語(yǔ)句太長(zhǎng)時(shí)可以用該符號(hào)把它分段寫(xiě)在幾行中。
例:
<< “u=” << u << “v\
=” << v << “w=” << w << endl;
2、輸入輸出流
C中I/O操作出現(xiàn)的問(wèn)題:
float f;
scanf(“%f”,i);
printf( “%d”,d);
float f;
cin >> i;
cout << f;
例1.4 一個(gè)完整的C 程序
int main()
{
char name[20];
cout << "Hello, your name: ";
cin >> name;
cout << name;
return 0;
}
-
程序中必須包含頭文件iostream.h
-
cin和>>,cout和<<配套使用
-
cin可以輸入多個(gè)數(shù)據(jù),但要用空白符隔開(kāi)(tab,空格,回車(chē))
如:cin >> a >> b >> c;
-
換行符:‘\n’或endl
如:cout << “x=” << x << endl; cout << “x=” << x << ‘\n’;
-
使用cout和cin時(shí),也可以對(duì)輸入和輸出的格式進(jìn)行控制,比如可用不同的進(jìn)制方式顯示數(shù)據(jù),只要設(shè)置轉(zhuǎn)換基數(shù)的操作符dec、hex和oct即可。
例1.5 操作符dec、 hex和oct的使用
void main()
{
int x=25;
cout << hex << x << ' ' << dec << x << ' ' << oct << x << '\n';
}
3、靈活的變量說(shuō)明
定義變量的位置
-
在C語(yǔ)言中,全局變量聲明必須在任何函數(shù)之前,局部變量必須集中在可執(zhí)行語(yǔ)句之前。
-
Cpp中的變量聲明非常靈活,它允許變量聲明與可執(zhí)行語(yǔ)句在程序中交替出現(xiàn)。
{
int i;
i=10;
int j;
j=25;
// …
}
float fun(int x,int y)
{
for(int i=0;i<10;i )
{
int sum=0;
sum=sum i;
cout<<“sum=”<
int z=0;
z=x y;
}
4、結(jié)構(gòu)、聯(lián)合和枚舉名
在C 中,結(jié)構(gòu)名、聯(lián)合名、枚舉名都是類(lèi)型名。在定義變量時(shí),不必在結(jié)構(gòu)名、聯(lián)合名或枚舉名前冠以struct、union或enum。
struct string{
char *string;
int length;
};
union number{
int i;
float f;
};
struct string str;
union number x;
string str;
number x;
5、函數(shù)原型
C語(yǔ)言建議編程者為程序中的每一個(gè)函數(shù)建立原型,而Cpp要求為每一個(gè)函數(shù)建立原型,以說(shuō)明函數(shù)的名稱、參數(shù)類(lèi)型與個(gè)數(shù),以及函數(shù)返回值的類(lèi)型。
-
函數(shù)原型語(yǔ)法的一般形式為:返回類(lèi)型 函數(shù)名(參數(shù)表);
-
函數(shù)原型是一條語(yǔ)句,它必須以分號(hào)結(jié)束。
例1.6 函數(shù)原型的說(shuō)明
void write(char *s);
void main()
{write("Hello,world!");}
void write(char *s)
{cout<
說(shuō)明:
-
函數(shù)原型的參數(shù)表中可不包含參數(shù)的名字,而只包含它們的類(lèi)型。例如:long Area(int ,int);
-
函數(shù)定義由函數(shù)首部和函數(shù)體構(gòu)成。函數(shù)首部和函數(shù)原型基本一樣,但函數(shù)首部中的參數(shù)必須給出名字而且不包含結(jié)尾的分號(hào)。
-
Cpp的參數(shù)說(shuō)明必須放在函數(shù)說(shuō)明后的括號(hào)內(nèi),不可將函數(shù)參數(shù)說(shuō)明放在函數(shù)首部和函數(shù)體之間。這種方法只在C中成立。
-
主函數(shù)不必進(jìn)行原型說(shuō)明,因?yàn)樗豢闯勺詣?dòng)說(shuō)明原型的函數(shù)。
-
原型說(shuō)明中沒(méi)有指定返回類(lèi)型的函數(shù)(包括主函數(shù)main),Cpp默認(rèn)該函數(shù)的返回類(lèi)型是int
-
如果一個(gè)函數(shù)沒(méi)有返回值,則必須在函數(shù)原型中注明返回類(lèi)型為void,主函數(shù)類(lèi)似處理。
-
如果函數(shù)原型中未注明參數(shù),Cpp假定該函數(shù)的參數(shù)表為空(void)。
6、const修飾符
-
在C中,習(xí)慣使用#define定義常量。
…………
s = 2 * PI * r;
…………
-
C 利用const定義正規(guī)常數(shù)
說(shuō)明:
如:const int a=10; 表示定義了一個(gè)初始值為10的整型常量,它在程序中不可改變,但可用于表達(dá)式的計(jì)算中。
例2.6 #define的不安全性
main()
{
int a=1;
#define T1 a a
#define T2 T1-T1
cout<<"T2 is "<
return 0;
}
int main()
{
int a=1;
const T1=a a;
const T2=T1-T1;
cout <<"T2 is"<
return 0;
}
const可以與指針一起使用
-
(1)指向常量的指針:一個(gè)指向常量的指針變量。
pc[3]=‘x’; //錯(cuò)誤
pc=“efgh”; //允許
-
(2)常指針:把指針本身,而不是它指向的對(duì)象聲明為常量。
pc[3]=‘x’; //合法
pc=“efgh”; //出錯(cuò)
-
(3)指向常量的常指針:這個(gè)指針本身不能改變,它所指向的值也不能改變。
pc[3]=‘x’; //出錯(cuò)
pc=“efgh”; //出錯(cuò)
說(shuō)明
-
(1). 如果用const定義的是一個(gè)整型常量,關(guān)鍵詞int可以省略。所以下面的兩語(yǔ)句是等價(jià)的
-
(2). 常量一旦被建立,在程序的任何地方都不能再更改。
-
(3). 與#define定義的常量有所不同,const定義的常量可以有自己的數(shù)據(jù)類(lèi)型,這樣C 的編譯程序可以進(jìn)行更加嚴(yán)格的類(lèi)型檢查,具有良好的編譯時(shí)的檢測(cè)性。
-
(4). 函數(shù)參數(shù)也可以用const說(shuō)明,用于保證實(shí)參在該函數(shù)內(nèi)部不被改動(dòng),大多數(shù)C 編譯器能對(duì)具有const參數(shù)的函數(shù)進(jìn)行更好的代碼優(yōu)化。
例如:通過(guò)函數(shù)i_Max求出整型數(shù)組a[200]中的最大值,函數(shù)原型應(yīng)該是:int i_Max(const int* ptr);
這樣做的目的是確保原數(shù)組的數(shù)據(jù)不被破壞,即在函數(shù)中對(duì)數(shù)組元素的操作只許讀,而不許寫(xiě)。調(diào)用時(shí)的格式可以是:i_Max(a);
7、void型指針
void 通常表示無(wú)值,但將void作為指針的類(lèi)型時(shí),它卻表示不確定的類(lèi)型。
void* pc; //正確,可以聲明void類(lèi)型的指針
int i=456;
char c=‘a(chǎn)’;
pc=