當(dāng)前位置:首頁 > 公眾號(hào)精選 > 嵌入式微處理器
[導(dǎo)讀]由C到COOP第一課C語言的局限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),主要有:1、全面兼容C,C的許多代碼不經(jīng)修改就可以為Cpp所用,用C編寫的庫函數(shù)和實(shí)用軟件可以用于Cpp。2、用C編寫的程序可讀性更...


由C到C

OOP第一課


  • C語言的局限

  • 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),主要有:


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

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

3、生成代碼的質(zhì)量高,運(yùn)行效率高。

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

5、支持面向?qū)ο蟮臋C(jī)制,可方便的構(gòu)造出模擬現(xiàn)實(shí)問題的實(shí)體和操作。

C 的程序特征

例1.1 輸出一行字符:“This is a C program.”。

程序如下:


#include??//包含頭文件iostream
using?namespace?std;?//使用命名空間std
int?main(?)
{
????cout<<″This?is?a?C ?program.″;
????return?0;
}

在運(yùn)行時(shí)會(huì)在屏幕上輸出以下一行信息:


This is a C program.


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

  • 函數(shù)體是由大括號(hào){}括起來的。本例中主函數(shù)內(nèi)只有一個(gè)以cout開頭的語句。注意C 所有語句最后都應(yīng)當(dāng)有一個(gè)分號(hào)。

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

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

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

  • iostream是i-o-stream3個(gè)詞的組合,從它的形式就可以知道它代表“輸入輸出流”的意思,由于這類文件都放在程序單元的開頭,所以稱為“頭文件” (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)庫中的類和函數(shù)是在命名空間std中聲明的,因此程序中如果需要用到Cpp標(biāo)準(zhǔn)庫(此時(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ù)之和

//?求兩數(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)返回一個(gè)零值
}?//函數(shù)結(jié)束

本程序的作用是求兩個(gè)整數(shù)a和b之和sum。


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


例1.3 給兩個(gè)數(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)返回一個(gè)零值
}?//主函數(shù)結(jié)束

本程序包括兩個(gè)函數(shù):主函數(shù)main和被調(diào)用的函數(shù)max。


程序運(yùn)行情況如下:


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

  • max=25 (輸出m的值)


注意輸入的兩個(gè)數(shù)據(jù)間用一個(gè)或多個(gè)空格間隔,不能以逗號(hào)或其他符號(hào)間隔。


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


為了解決這個(gè)問題,在主函數(shù)中需要對(duì)被調(diào)用函數(shù)作聲明。上面的程序可以改寫如下:


#include?
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=″<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ù)的首部的末尾加一個(gè)分號(hào),就成為對(duì)該函數(shù)的函數(shù)聲明。函數(shù)聲明的位置應(yīng)當(dāng)在函數(shù)調(diào)用之前。

C 程序的結(jié)構(gòu)特性

一個(gè)面向?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è)計(jì)始終圍繞“類”展開。通過聲明類,構(gòu)建了程序所要完成的功能,體現(xiàn)了面向?qū)ο蟪绦蛟O(shè)計(jì)的思想。

C++程序的編輯、編譯和運(yùn)行

C 源程序文件的擴(kuò)展名為.CPP


可以用多種編譯器編輯、編譯和運(yùn)行


C 對(duì)C的補(bǔ)充


1、注釋與續(xù)行


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


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


例如:


X?=?y? ?z;?/*This?is?a?comment?*/
X?=?y? ?z;?//This?is?a?comment


  • 續(xù)行符:“\”(反斜杠)。作用是當(dāng)一個(gè)語句太長時(shí)可以用該符號(hào)把它分段寫在幾行中。
    例:


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?<

cout和cin分別是C 的標(biāo)準(zhǔn)輸出流和輸入流。Cpp支持重定向,但一般cout指的是屏幕, cin指的是鍵盤。


操作符“<<”和“>>”除了具有C語言中定義的左移和右移的功能外,在這里符號(hào)“<<”是把右方的參數(shù)寫到標(biāo)準(zhǔn)輸出流cout中;相反,符號(hào)“>>”則是將標(biāo)準(zhǔn)輸入流的數(shù)據(jù)賦給右方的變量。


例1.4 一個(gè)完整的C 程序

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

注意:

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

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

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

如: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的使用

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

輸出結(jié)果為:19 25 31


3、靈活的變量說明


定義變量的位置

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


(1) 在函數(shù)體內(nèi)部


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


(2)?形式參數(shù)


當(dāng)定義一個(gè)有參函數(shù)時(shí),函數(shù)名后面括號(hào)內(nèi)的變量,統(tǒng)稱為形式參數(shù)。


(3)?全局變量


在所有函數(shù)體外部定義的變量,其作用范圍是整個(gè)程序,并在整個(gè)程序運(yùn)行期間有效。


  • 在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)合名、枚舉名都是類型名。在定義變量時(shí),不必在結(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中,定義變量時(shí),必須寫成:


enum?boole?done;
struct?string?str;
union?number?x;

但是,在C 中,可以說明為:


boole?done;
string?str;
number?x;

5、函數(shù)原型

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


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


例如


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

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

  • 函數(shù)原型是一條語句,它必須以分號(hào)結(jié)束。


例1.6 函數(shù)原型的說明

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

在程序中,要求一個(gè)函數(shù)的原型出現(xiàn)在該函數(shù)的調(diào)用語句之前。


說明:


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

  • 函數(shù)定義由函數(shù)首部和函數(shù)體構(gòu)成。函數(shù)首部和函數(shù)原型基本一樣,但函數(shù)首部中的參數(shù)必須給出名字而且不包含結(jié)尾的分號(hào)。

  • Cpp的參數(shù)說明必須放在函數(shù)說明后的括號(hào)內(nèi),不可將函數(shù)參數(shù)說明放在函數(shù)首部和函數(shù)體之間。這種方法只在C中成立。

  • 主函數(shù)不必進(jìn)行原型說明,因?yàn)樗豢闯勺詣?dòng)說明原型的函數(shù)。

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

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

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


6、const修飾符


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


一般格式:?#define 宏名 常數(shù)



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

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


一般格式:const 數(shù)據(jù)類型標(biāo)識(shí)符 常數(shù)名=常量值;


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

說明:


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

2、數(shù)據(jù)類型是一個(gè)可選項(xiàng),用來指定常數(shù)值的數(shù)據(jù)類型,如果省略了該數(shù)據(jù)類型,那么編譯程序認(rèn)為它是 int 類型。

如:const int a=10;?表示定義了一個(gè)初始值為10的整型常量,它在程序中不可改變,但可用于表達(dá)式的計(jì)算中。

例2.6?#define的不安全性

#include?"iostream.h"
main()
{
????int?a=1;
????#define?T1?a a
????#define?T2?T1-T1
????cout<<"T2?is?"<endl;
????return?0;
}

但實(shí)際的輸出是:T2 is 2

const作用與#define相似,但消除了#define的不安全性。

如果用const取代了兩個(gè)#define,就不會(huì)引起這個(gè)錯(cuò)誤。


#include
int?main()
{
????int?a=1;
????const?T1=a a;
????const?T2=T1-T1;
????cout?<<"T2?is"<endl;
????return?0;
}

const可以與指針一起使用

  • (1)指向常量的指針:一個(gè)指向常量的指針變量。


例如:


const?char*?pc=“abcd”;??//聲明指向常量的指針
pc[3]=‘x’;??//錯(cuò)誤
pc=“efgh”;??//允許


  • (2)常指針:把指針本身,而不是它指向的對(duì)象聲明為常量。


例如:


char*?const?pc=“abcd”;??//常指針
pc[3]=‘x’;??//合法
pc=“efgh”;??//出錯(cuò)

創(chuàng)建一個(gè)常指針,就是創(chuàng)建一個(gè)不能移動(dòng)的固定指針,但是它所指的數(shù)據(jù)可以改變。例如:


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


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


例如:


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

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


說明


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

    const int bufsize=200;

    const bufsize=200;

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

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

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

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

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

7、void型指針

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


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


例如下面的程序段


void?pa;????//錯(cuò)誤,不能聲明void類型的指針變量
void*?pc;???//正確,可以聲明void類型的指針
int?i=456;
char?c=‘a(chǎn)’;
pc=
嵌入式ARM

掃描二維碼,關(guān)注更多精彩內(nèi)容

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

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

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

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

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

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

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

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

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

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

關(guān)鍵字: 通信 BSP 電信運(yùn)營商 數(shù)字經(jīng)濟(jì)

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

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

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

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉