當前位置:首頁 > 公眾號精選 > 嵌入式大雜燴
[導讀]關注「Linux大陸」,一起進步!鏈接:https://www.cnblogs.com/whale90830/p/10488595.html由C到COOP第一課C語言的局限C的特點C的程序特征C程序的結構特性C程序的編輯、編譯和運行?C對C的補充C的特點C繼承了C的優(yōu)點,并有自己...



由C到C

OOP第一課



  • C語言的局限


  • C 的特點


  • C 的程序特征


  • C 程序的結構特性


  • C 程序的編輯、編譯和運行


  • ?C 對C的補充


C 的特點

C 繼承了C的優(yōu)點,并有自己的特點,主要有:



1、全面兼容C,C的許多代碼不經修改就可以為Cpp所用,用C編寫的庫函數和實用軟件可以用于Cpp。


2、用C 編寫的程序可讀性更好,代碼結構更為合理,可直接在程序中映射問題空間結構。


3、生成代碼的質量高,運行效率高。


4、從開發(fā)時間、費用到形成軟件的可重用性、可擴充性、可維護性和可靠性等方面有了很大提高,使得大中型的程序開發(fā)項目變得容易得多。


5、支持面向對象的機制,可方便的構造出模擬現實問題的實體和操作。


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代表“主函數”的名字。每一個C 程序都必須有一個 main 函數。main前面的int的作用是聲明函數的類型為整型。程序第6行的作用是向操作系統(tǒng)返回一個零值。如果程序不能正常執(zhí)行,則會自動向操作系統(tǒng)返回一個非零值,一般為-1。


  • 函數體是由大括號{}括起來的。本例中主函數內只有一個以cout開頭的語句。注意C 所有語句最后都應當有一個分號。


  • 再看程序的第1行“#include


  • ”,這不是Cpp的語句,而是Cpp的一個預處理命令,它以“#”開頭以與Cpp語句相區(qū)別,行的末尾沒有分號。


  • #include是一個“包含命令”,它的作用是將文件iostream的內容包含到該命令所在的程序文件中,代替該命令行。文件iostream的作用是向程序提供輸入或輸出時所需要的一些信息。


  • iostream是i-o-stream3個詞的組合,從它的形式就可以知道它代表“輸入輸出流”的意思,由于這類文件都放在程序單元的開頭,所以稱為“頭文件” (head file)。在程序進行編譯時,先對所有的預處理命令進行處理,將頭文件的具體內容代替#include命令行,然后再對該程序單元進行整體編譯。


  • 程序的第2行“using namespace std;”的意思是“使用命名空間std”。Cpp標準庫中的類和函數是在命名空間std中聲明的,因此程序中如果需要用到Cpp標準庫(此時就需要用#include命令行),就需要用“using namespace std;”作聲明,表示要用到命名空間std中的內容。


  • 在初學C 時,對本程序中的第1,2行可以不必深究,只需知道:如果程序有輸入或輸出時,必須使用“#include


  • ”命令以提供必要的信息,同時要用“using namespace std;”,使程序能夠使用這些信息,否則程序編譯時將出錯。




例1.2 求a和b兩個數之和


// 求兩數之和 (本行是注釋行)
#include //預處理命令
using namespace std; //使用命名空間std
int main( ) //主函數首部
{ //函數體開始
int a,b,sum; //定義變量
cin>>a>>b; //輸入語句
sum=a b; //賦值語句
cout<<″a b=″<endl; //輸出語句
return 0; //如程序正常結束,向操作系統(tǒng)返回一個零值
} //函數結束


本程序的作用是求兩個整數a和b之和sum。



第1行“//求兩數之和”是一個注釋行,Cpp規(guī)定在一行中如果出現“//” ,則從它開始到本行末尾之間的全部內容都作為注釋。



例1.3 給兩個數x和y, 求兩數中的大者


#include //預處理命令
using namespace std;
int max(int x,int y) //定義max函數,函數值為整型,形式參數x, y為整型
{ //max函數體開始
int z; //變量聲明,定義本函數中用到的變量z為整型
if(x>y) z=x; //if語句,如果x>y, 則將x的值賦給z
else z=y; //否則,將y的值賦給z
return(z); //將z的值返回,通過max帶回調用處
} //max函數結束
int main( ) //主函數
{ //主函數體開始
int a,b,m; //變量聲明
cin>>a>>b; //輸入變量a和b的值
m=max(a,b); //調用max函數,將得到的值賦給m
cout<<″max=″<//輸出大數m的值
return 0; //如程序正常結束,向操作系統(tǒng)返回一個零值
} //主函數結束


本程序包括兩個函數:主函數main和被調用的函數max。



程序運行情況如下:



  • 18 25 ↙ (輸入18和25給a和b)


  • max=25 (輸出m的值)



注意輸入的兩個數據間用一個或多個空格間隔,不能以逗號或其他符號間隔。



在上面的程序中,max函數出現在main函數之前,因此在main函數中調用max函數時,編譯系統(tǒng)能識別max是已定義的函數名。如果把兩個函數的位置對換一下,即先寫main函數,后寫max函數,這時在編譯main函數遇到max時,編譯系統(tǒng)無法知道m(xù)ax代表什么含義,因而無法編譯,按出錯處理。



為了解決這個問題,在主函數中需要對被調用函數作聲明。上面的程序可以改寫如下:



#include
using namespace std;
int max(int x,int y); //對max函數作聲明
int main( )
{
int a,b,c;
cin>>a>>b;
c=max(a,b); //調用max函數例1.3 給兩個數x和y, 求兩數中的大者。
cout<<″max=″<endl;
return 0;
}
int max(int x,int y) //定義max函數
{
int z;
if(x>y) z=x;
else z=y;
return(z);
}


只要在被調用函數的首部的末尾加一個分號,就成為對該函數的函數聲明。函數聲明的位置應當在函數調用之前。


C 程序的結構特性

一個面向對象的C 程序一般由類的聲明和類的使用兩大部分組成。



類的使用部分一般由主函數及有關子函數組成。



典型的C 程序結構


#include 
//類的聲明部分
class A{
int x,y,z;
……
fun( ){……}
……
};
//類的使用部分
int main()
{
A a;
……
a.fun();
return 0;
}


在C 程序中,程序設計始終圍繞“類”展開。通過聲明類,構建了程序所要完成的功能,體現了面向對象程序設計的思想。


C++程序的編輯、編譯和運行

C 源程序文件的擴展名為.CPP



可以用多種編譯器編輯、編譯和運行



C 對C的補充


1、注釋與續(xù)行


  • 注釋符:“/*”和“*/” 或“//” 。



Cpp新增了注釋語句,它由“//”開始,到行尾結束。



例如:



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操作出現的問題:



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語言中定義的左移和右移的功能外,在這里符號“<<”是把右方的參數寫到標準輸出流cout中;相反,符號“>>”則是將標準輸入流的數據賦給右方的變量。



例1.4 一個完整的C 程序


#include
int main()
{
char name[20];
cout << "Hello, your name: ";
cin >> name;
cout << name;
return 0;
}


注意:


  • 程序中必須包含頭文件iostream.h


  • cin和>>,cout和<<配套使用


  • cin可以輸入多個數據,但要用空白符隔開(tab,空格,回車)


如:cin >> a >> b >> c;


  • 換行符:‘\n’或endl


如:cout << “x=” << x << endl; cout << “x=” << x << ‘\n’;


  • 使用cout和cin時,也可以對輸入和輸出的格式進行控制,比如可用不同的進制方式顯示數據,只要設置轉換基數的操作符dec、hex和oct即可。



例1.5 操作符dec、 hex和oct的使用


#include
void main()
{
int x=25;
cout << hex << x << ' ' << dec << x << ' ' << oct << x << '\n';
}


輸出結果為:19 25 31



3、靈活的變量說明


定義變量的位置


在程序中的不同位置采用不同的變量定義方式,決定了該變量具有不同的特點。變量的定義一般可有以下三種位置:



(1) 在函數體內部



在函數體內部定義的變量稱為局部變量,這種局部變量只在進入定義它的函數體時起作用,離開該函數體后該變量就消失(被釋放),即不再起作用。因此,不同函數體內部可以定義相同名稱的變量,而互不干擾。



(2) 形式參數



當定義一個有參函數時,函數名后面括號內的變量,統(tǒng)稱為形式參數。



(3) 全局變量



在所有函數體外部定義的變量,其作用范圍是整個程序,并在整個程序運行期間有效。



  • 在C語言中,全局變量聲明必須在任何函數之前,局部變量必須集中在可執(zhí)行語句之前。


  • Cpp中的變量聲明非常靈活,它允許變量聲明與可執(zhí)行語句在程序中交替出現。



例如



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、結構、聯(lián)合和枚舉名

在C 中,結構名、聯(lián)合名、枚舉名都是類型名。在定義變量時,不必在結構名、聯(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、函數原型

C語言建議編程者為程序中的每一個函數建立原型,而Cpp要求為每一個函數建立原型,以說明函數的名稱、參數類型與個數,以及函數返回值的類型。



其主要目的是讓C 編譯程序進行類型檢查,即形參與實參的類型匹配檢查,以及返回值是否與原型相符,以維護程序的正確性。



例如



int sum(int a,int b); //是函數sum的原型


  • 函數原型語法的一般形式為:返回類型 函數名(參數表);


  • 函數原型是一條語句,它必須以分號結束。



例1.6 函數原型的說明


#include
void write(char *s);
void main()
{write("Hello,world!");}
void write(char *s)
{cout<


在程序中,要求一個函數的原型出現在該函數的調用語句之前。



說明:


  • 函數原型的參數表中可不包含參數的名字,而只包含它們的類型。例如:long Area(int ,int);


  • 函數定義由函數首部和函數體構成。函數首部和函數原型基本一樣,但函數首部中的參數必須給出名字而且不包含結尾的分號。


  • Cpp的參數說明必須放在函數說明后的括號內,不可將函數參數說明放在函數首部和函數體之間。這種方法只在C中成立。


  • 主函數不必進行原型說明,因為它被看成自動說明原型的函數。


  • 原型說明中沒有指定返回類型的函數(包括主函數main),Cpp默認該函數的返回類型是int


  • 如果一個函數沒有返回值,則必須在函數原型中注明返回類型為void,主函數類似處理。


  • 如果函數原型中未注明參數,Cpp假定該函數的參數表為空(void)。



6、const修飾符


  • 在C中,習慣使用#define定義常量。



一般格式: #define 宏名 常數





#define PI 3.14
…………
s = 2 * PI * r;
…………


  • C 利用const定義正規(guī)常數



一般格式:const 數據類型標識符 常數名=常量值;



采用這種方式定義的常量是類型化的,它有地址,可以用指針指向這個值,但不能修改它。


說明:


1、const必須放在被修飾類型符和類型名前面


2、數據類型是一個可選項,用來指定常數值的數據類型,如果省略了該數據類型,那么編譯程序認為它是 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 2


const作用與#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)建一個不能移動的固定指針,但是它所指的數據可以改變。例如:



  • (3)指向常量的常指針:這個指針本身不能改變,它所指向的值也不能改變。



要聲明一個指向常量的常指針,二者都要聲明為const。



例如:



const char* const pc=“abcd”; //指向常量的常指針
pc[3]=‘x’; //出錯
pc=“efgh”; //出錯


這個語句的含義是:聲明了一個名為pc的指針變量,它是一個指向字符型常量的常指針,用“abcd”的地址初始化該指針。



說明


  • (1). 如果用const定義的是一個整型常量,關鍵詞int可以省略。所以下面的兩語句是等價的


    const int bufsize=200;


    const bufsize=200;


  • (2). 常量一旦被建立,在程序的任何地方都不能再更改。


  • (3). 與#define定義的常量有所不同,const定義的常量可以有自己的數據類型,這樣C 的編譯程序可以進行更加嚴格的類型檢查,具有良好的編譯時的檢測性。


  • (4). 函數參數也可以用const說明,用于保證實參在該函數內部不被改動,大多數C 編譯器能對具有const參數的函數進行更好的代碼優(yōu)化。


例如:通過函數i_Max求出整型數組a[200]中的最大值,函數原型應該是:int i_Max(const int* ptr);


這樣做的目的是確保原數組的數據不被破壞,即在函數中對數組元素的操作只許讀,而不許寫。調用時的格式可以是:i_Max(a);


7、void型指針

void 通常表示無值,但將void作為指針的類型時,它卻表示不確定的類型。



這種void型指針是一種通用型指針,也就是說任何類型的指針值都可以賦給void類型的指針變量。



例如下面的程序段



void pa; //錯誤,不能聲明void類型的指針變量
void* pc; //正確,可以聲明void類型的指針
int i=456;
char c=‘a’;
pc=
本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯(lián)系該專欄作者,如若文章內容侵犯您的權益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或將催生出更大的獨角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數字化轉型技術解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關鍵字: AWS AN BSP 數字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術公司SODA.Auto推出其旗艦產品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關鍵字: 汽車 人工智能 智能驅動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務中斷的風險,如企業(yè)系統(tǒng)復雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務連續(xù)性,提升韌性,成...

關鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據媒體報道,騰訊和網易近期正在縮減他們對日本游戲市場的投資。

關鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數據產業(yè)博覽會開幕式在貴陽舉行,華為董事、質量流程IT總裁陶景文發(fā)表了演講。

關鍵字: 華為 12nm EDA 半導體

8月28日消息,在2024中國國際大數據產業(yè)博覽會上,華為常務董事、華為云CEO張平安發(fā)表演講稱,數字世界的話語權最終是由生態(tài)的繁榮決定的。

關鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應對環(huán)境變化,經營業(yè)績穩(wěn)中有升 落實提質增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務引領增長 以科技創(chuàng)新為引領,提升企業(yè)核心競爭力 堅持高質量發(fā)展策略,塑強核心競爭優(yōu)勢...

關鍵字: 通信 BSP 電信運營商 數字經濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術學會聯(lián)合牽頭組建的NVI技術創(chuàng)新聯(lián)盟在BIRTV2024超高清全產業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現場 NVI技術創(chuàng)新聯(lián)...

關鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關鍵字: BSP 信息技術
關閉
關閉