由C到C
時間:2021-11-01 14:30:35
手機看文章
掃描二維碼
隨時隨地手機看文章
[導(dǎo)讀]C語言的局限類型檢查機制相對較弱,使得程序中的一些錯誤不能在編譯時由編譯器檢查出來。C語言本身沒有支持代碼重用的語言結(jié)構(gòu)不適合開發(fā)大型程序,當程序的規(guī)模達到一定的程度時,程序員很難控制程序的復(fù)雜性。C的特點C繼承了C的優(yōu)點,并有自己的特點,主要有:全面兼容C,C的許多代碼不經(jīng)修改...
C語言的局限
- 類型檢查機制相對較弱,使得程序中的一些錯誤不能在編譯時由編譯器檢查出來。
- C語言本身沒有支持代碼重用的語言結(jié)構(gòu)
- 不適合開發(fā)大型程序,當程序的規(guī)模達到一定的程度時,程序員很難控制程序的復(fù)雜性。
C 的特點
C 繼承了C的優(yōu)點,并有自己的特點,主要有:- 全面兼容C,C的許多代碼不經(jīng)修改就可以為Cpp所用,用C編寫的庫函數(shù)和實用軟件可以用于Cpp。
- 用C 編寫的程序可讀性更好,代碼結(jié)構(gòu)更為合理,可直接在程序中映射問題空間結(jié)構(gòu)。
- 生成代碼的質(zhì)量高,運行效率高。
- 從開發(fā)時間、費用到形成軟件的可重用性、可擴充性、可維護性和可靠性等方面有了很大提高,使得大中型的程序開發(fā)項目變得容易得多。
- 支持面向?qū)ο蟮臋C制,可方便的構(gòu)造出模擬現(xiàn)實問題的實體和操作。
C 的程序特征
例1.1 輸出一行字符:“This is a C program.”。
程序如下:#include //包含頭文件iostream
using namespace std; //使用命名空間std
int main( )
{
cout<<″This is a C program.″;
return 0;
}
在運行時會在屏幕上輸出以下一行信息:This is a C program.
- 用main代表“主函數(shù)”的名字。每一個C 程序都必須有一個 main 函數(shù)。main前面的int的作用是聲明函數(shù)的類型為整型。程序第6行的作用是向操作系統(tǒng)返回一個零值。如果程序不能正常執(zhí)行,則會自動向操作系統(tǒng)返回一個非零值,一般為-1。
- 函數(shù)體是由大括號{}括起來的。本例中主函數(shù)內(nèi)只有一個以cout開頭的語句。注意C 所有語句最后都應(yīng)當有一個分號。
- 再看程序的第1行“#include
”,這不是Cpp的語句,而是Cpp的一個預(yù)處理命令,它以“#”開頭以與Cpp語句相區(qū)別,行的末尾沒有分號。 #include
是一個“包含命令”,它的作用是將文件iostream的內(nèi)容包含到該命令所在的程序文件中,代替該命令行。文件iostream的作用是向程序提供輸入或輸出時所需要的一些信息。- iostream是i-o-stream3個詞的組合,從它的形式就可以知道它代表“輸入輸出流”的意思,由于這類文件都放在程序單元的開頭,所以稱為“頭文件” (head file)。在程序進行編譯時,先對所有的預(yù)處理命令進行處理,將頭文件的具體內(nèi)容代替#include命令行,然后再對該程序單元進行整體編譯。
- 程序的第2行“using namespace std;”的意思是“使用命名空間std”。Cpp標準庫中的類和函數(shù)是在命名空間std中聲明的,因此程序中如果需要用到Cpp標準庫(此時就需要用#include命令行),就需要用“using namespace std;”作聲明,表示要用到命名空間std中的內(nèi)容。
- 在初學(xué)C 時,對本程序中的第1,2行可以不必深究,只需知道:如果程序有輸入或輸出時,必須使用“#include
”命令以提供必要的信息,同時要用“using namespace std;”,使程序能夠使用這些信息,否則程序編譯時將出錯。
例1.2 求a和b兩個數(shù)之和
// 求兩數(shù)之和 (本行是注釋行)
#include //預(yù)處理命令
using namespace std; //使用命名空間std
int main( ) //主函數(shù)首部
{ //函數(shù)體開始
int a,b,sum; //定義變量
cin>>a>>b; //輸入語句
sum=a b; //賦值語句
cout<<″a b=″<endl; //輸出語句
return 0; //如程序正常結(jié)束,向操作系統(tǒng)返回一個零值
} //函數(shù)結(jié)束
本程序的作用是求兩個整數(shù)a和b之和sum。第1行“//求兩數(shù)之和”是一個注釋行,Cpp規(guī)定在一行中如果出現(xiàn)“//” ,則從它開始到本行末尾之間的全部內(nèi)容都作為注釋。例1.3 給兩個數(shù)x和y, 求兩數(shù)中的大者
#include //預(yù)處理命令
using namespace std;
int max(int x,int y) //定義max函數(shù),函數(shù)值為整型,形式參數(shù)x, y為整型
{ //max函數(shù)體開始
int z; //變量聲明,定義本函數(shù)中用到的變量z為整型
if(x>y) z=x; //if語句,如果x>y, 則將x的值賦給z
else z=y; //否則,將y的值賦給z
return(z); //將z的值返回,通過max帶回調(diào)用處
} //max函數(shù)結(jié)束
int main( ) //主函數(shù)
{ //主函數(shù)體開始
int a,b,m; //變量聲明
cin>>a>>b; //輸入變量a和b的值
m=max(a,b); //調(diào)用max函數(shù),將得到的值賦給m
cout<<″max=″<//輸出大數(shù)m的值
return 0; //如程序正常結(jié)束,向操作系統(tǒng)返回一個零值
} //主函數(shù)結(jié)束
本程序包括兩個函數(shù):主函數(shù)main和被調(diào)用的函數(shù)max。程序運行情況如下:- 18 25 ↙ (輸入18和25給a和b)
- max=25 (輸出m的值)
#include
using namespace std;
int max(int x,int y); //對max函數(shù)作聲明
int main( )
{
int a,b,c;
cin>>a>>b;
c=max(a,b); //調(diào)用max函數(shù)例1.3 給兩個數(shù)x和y, 求兩數(shù)中的大者。
cout<<″max=″<endl;
return 0;
}
int max(int x,int y) //定義max函數(shù)
{
int z;
if(x>y) z=x;
else z=y;
return(z);
}
只要在被調(diào)用函數(shù)的首部的末尾加一個分號,就成為對該函數(shù)的函數(shù)聲明。函數(shù)聲明的位置應(yīng)當在函數(shù)調(diào)用之前。C 程序的結(jié)構(gòu)特性
一個面向?qū)ο蟮腃 程序一般由類的聲明和類的使用兩大部分組成。類的使用部分一般由主函數(shù)及有關(guān)子函數(shù)組成。典型的C 程序結(jié)構(gòu)
#include
//類的聲明部分
class A{
int x,y,z;
……
fun( ){……}
……
};
//類的使用部分
int main()
{
A a;
……
a.fun();
return 0;
}
在C 程序中,程序設(shè)計始終圍繞“類”展開。通過聲明類,構(gòu)建了程序所要完成的功能,體現(xiàn)了面向?qū)ο蟪绦蛟O(shè)計的思想。C++程序的編輯、編譯和運行
C 源程序文件的擴展名為.CPP可以用多種編譯器編輯、編譯和運行C 對C的補充
1. 注釋與續(xù)行
- 注釋符:“/*”和“*/” 或“//” 。
例如:
X = y z; /*This is a comment */
X = y z; //This is a comment
- 續(xù)行符:“\”(反斜杠)。作用是當一個語句太長時可以用該符號把它分段寫在幾行中。
例:
cout << ‘\n’ << “x=” << x << “y=” << y << “z=” << z\
<< “u=” << u << “v\
=” << v << “w=” << w << endl;
2. 輸入輸出流
C中I/O操作出現(xiàn)的問題:int i;
float f;
scanf(“%f”,i);
printf( “%d”,d);
Cpp中使用更安全更方便的方法:int i;
float f;
cin >> i;
cout << f;
cout和cin分別是C 的標準輸出流和輸入流。Cpp支持重定向,但一般cout指的是屏幕, cin指的是鍵盤。操作符“<<”和“>>”除了具有C語言中定義的左移和右移的功能外,在這里符號“<<”是把右方的參數(shù)寫到標準輸出流cout中;相反,符號“>>”則是將標準輸入流的數(shù)據(jù)賦給右方的變量。例1.4 一個完整的C 程序
#include
int main()
{
char name[20];
cout << "Hello, your name:";
cin >> name;
cout << name;
return 0;
}
注意:- 程序中必須包含頭文件
iostream.h
cin
和>>
,cout
和<<
配套使用cin
可以輸入多個數(shù)據(jù),但要用空白符隔開(tab,空格,回車)如:
cin >> a >> b >> c;
- 換行符:‘\n’或endl
如:
cout << “x=” << x << endl;
cout << “x=” << x << ‘\n’;
- 使用
cout
和cin
時,也可以對輸入和輸出的格式進行控制,比如可用不同的進制方式顯示數(shù)據(jù),只要設(shè)置轉(zhuǎn)換基數(shù)的操作符dec
、hex
和oct
即可。
例1.5 操作符dec、 hex和oct的使用
#include
void main()
{
int x=25;
cout << hex << x << ' ' << dec << x << ' ' << oct << x << '\n';
}
輸出結(jié)果為:19 25 313. 靈活的變量說明
定義變量的位置
在程序中的不同位置采用不同的變量定義方式,決定了該變量具有不同的特點。變量的定義一般可有以下三種位置:(1) 在函數(shù)體內(nèi)部在函數(shù)體內(nèi)部定義的變量稱為局部變量,這種局部變量只在進入定義它的函數(shù)體時起作用,離開該函數(shù)體后該變量就消失(被釋放),即不再起作用。因此,不同函數(shù)體內(nèi)部可以定義相同名稱的變量,而互不干擾。(2) 形式參數(shù)當定義一個有參函數(shù)時,函數(shù)名后面括號內(nèi)的變量,統(tǒng)稱為形式參數(shù)。(3) 全局變量在所有函數(shù)體外部定義的變量,其作用范圍是整個程序,并在整個程序運行期間有效。- 在C語言中,全局變量聲明必須在任何函數(shù)之前,局部變量必須集中在可執(zhí)行語句之前。
- Cpp中的變量聲明非常靈活,它允許變量聲明與可執(zhí)行語句在程序中交替出現(xiàn)。
例如
f( )
{
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)合名、枚舉名都是類型名。在定義變量時,不必在結(jié)構(gòu)名、聯(lián)合名或枚舉名前冠以struct、union或enum。例如:enum boole{FALSE,TRUE};
struct string{
char *string;
int length;
};
union number{
int i;
float f;
};
在傳統(tǒng)的C中,定義變量時,必須寫成:enum boole done;
struct string str;
union number x;
但是,在C 中,可以說明為:boole done;
string str;
number x;
5. 函數(shù)原型
C語言建議編程者為程序中的每一個函數(shù)建立原型,而Cpp要求為每一個函數(shù)建立原型,以說明函數(shù)的名稱、參數(shù)類型與個數(shù),以及函數(shù)返回值的類型。其主要目的是讓C 編譯程序進行類型檢查,即形參與實參的類型匹配檢查,以及返回值是否與原型相符,以維護程序的正確性。例如int sum(int a,int b); //是函數(shù)sum的原型
- 函數(shù)原型語法的一般形式為:返回類型 函數(shù)名(參數(shù)表);
- 函數(shù)原型是一條語句,它必須以分號結(jié)束。
例1.6 函數(shù)原型的說明
#include
void write(char *s);
void main()
{write("Hello,world!");}
void write(char *s)
{cout<
在程序中,要求一個函數(shù)的原型出現(xiàn)在該函數(shù)的調(diào)用語句之前。說明:
- 函數(shù)原型的參數(shù)表中可不包含參數(shù)的名字,而只包含它們的類型。例如:
long Area(int ,int);
- 函數(shù)定義由函數(shù)首部和函數(shù)體構(gòu)成。函數(shù)首部和函數(shù)原型基本一樣,但函數(shù)首部中的參數(shù)必須給出名字而且不包含結(jié)尾的分號。
- Cpp的參數(shù)說明必須放在函數(shù)說明后的括號內(nèi),不可將函數(shù)參數(shù)說明放在函數(shù)首部和函數(shù)體之間。這種方法只在C中成立。
- 主函數(shù)不必進行原型說明,因為它被看成自動說明原型的函數(shù)。
- 原型說明中沒有指定返回類型的函數(shù)(包括主函數(shù)main),Cpp默認該函數(shù)的返回類型是int
- 如果一個函數(shù)沒有返回值,則必須在函數(shù)原型中注明返回類型為void,主函數(shù)類似處理。
- 如果函數(shù)原型中未注明參數(shù),Cpp假定該函數(shù)的參數(shù)表為空(void)。
6. const修飾符
- 在C中,習(xí)慣使用#define定義常量。
#define PI 3.14
…………
s = 2 * PI * r;
…………
- C 利用const定義正規(guī)常數(shù)
說明:
- const必須放在被修飾類型符和類型名前面
- 數(shù)據(jù)類型是一個可選項,用來指定常數(shù)值的數(shù)據(jù)類型,如果省略了該數(shù)據(jù)類型,那么編譯程序認為它是 int 類型。
如:
const int a=10;
表示定義了一個初始值為10的整型常量,它在程序中不可改變,但可用于表達式的計算中。
例2.6 #define
的不安全性
#include "iostream.h"
main()
{
int a=1;
#define T1 a a
#define T2 T1-T1
cout<<"T2 is "<endl;
return 0;
}
但實際的輸出是:T2 is 2const作用與#define
相似,但消除了#define
的不安全性。如果用const
取代了兩個#define
,就不會引起這個錯誤。#include
int main()
{
int a=1;
const T1=a a;
const T2=T1-T1;
cout <<"T2 is"<endl;
return 0;
}
const
可以與指針一起使用
- (1)指向常量的指針:一個指向常量的指針變量。
const char* pc=“abcd”; //聲明指向常量的指針
pc[3]=‘x’; //錯誤
pc=“efgh”; //允許
- (2)常指針:把指針本身,而不是它指向的對象聲明為常量。
char* const pc=“abcd”; //常指針
pc[3]=‘x’; //合法
pc=“efgh”; //出錯
創(chuàng)建一個常指針,就是創(chuàng)建一個不能移動的固定指針,但是它所指的數(shù)據(jù)可以改變。例如:- (3)指向常量的常指針:這個指針本身不能改變,它所指向的值也不能改變。
const char* const pc=“abcd”; //指向常量的常指針
pc[3]=‘x’; //出錯
pc=“efgh”; //出錯
這個語句的含義是:聲明了一個名為pc的指針變量,它是一個指向字符型常量的常指針,用“abcd”的地址初始化該指針。說明
- (1). 如果用
const
定義的是一個整型常量,關(guān)鍵詞int可以省略。所以下面的兩語句是等價的 const int bufsize=200;
const bufsize=200;
- (2). 常量一旦被建立,在程序的任何地方都不能再更改。
- (3). 與
#define
定義的常量有所不同,const
定義的常量可以有自己的數(shù)據(jù)類型,這樣C 的編譯程序可以進行更加嚴格的類型檢查,具有良好的編譯時的檢測性。 - (4). 函數(shù)參數(shù)也可以用
const
說明,用于保證實參在該函數(shù)內(nèi)部不被改動,大多數(shù)C 編譯器能對具有const
參數(shù)的函數(shù)進行更好的代碼優(yōu)化。例如:通過函數(shù)
i_Max
求出整型數(shù)組a[200]
中的最大值,函數(shù)原型應(yīng)該是:int i_Max(const int* ptr);
這樣做的目的是確保原數(shù)組的數(shù)據(jù)不被破壞,即在函數(shù)中對數(shù)組元素的操作只許讀,而不許寫。調(diào)用時的格式可以是:i_Max(a);
7. void型指針
void 通常表示無值,但將void作為指針的類型時,它卻表示不確定的類型。這種void型指針是一種通用型指針,也就是說任何類型的指針值都可以賦給void類型的指針變量。例如下面的程序段void pa; //錯誤,不能聲明void類型的指針變量
void* pc; //正確,可以聲明void類型的指針
int i=456;
char c=‘a(chǎn)’;
pc=