嵌入式编程:由 C语言到 C
扫描二维码
随时随地手机看文章
由C到C
OOP第一课
-
C语言的局限
-
C 的特点
-
C 的程序特征
-
C 程序的结构特性
-
C 程序的编辑、编译和运行
-
⭐C 对C的补充
C 的特点
C 继承了C的优点,并有自己的特点,主要有:
C 的程序特征
例1.1 输出一行字符:“This is a C program.”。
using namespace std; //使用命名空间std
int main( )
{
cout<<″This is a C program.″;
return 0;
}
-
用main代表“主函数”的名字。每一个C 程序都必须有一个 main 函数。main前面的int的作用是声明函数的类型为整型。程序第6行的作用是向操作系统返回一个零值。如果程序不能正常执行,则会自动向操作系统返回一个非零值,一般为-1。
-
函数体是由大括号{}括起来的。本例中主函数内只有一个以cout开头的语句。注意C 所有语句最后都应当有一个分号。
-
再看程序的第1行“#include
-
”,这不是Cpp的语句,而是Cpp的一个预处理命令,它以“#”开头以与Cpp语句相区别,行的末尾没有分号。
-
#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=″<
return 0; //如程序正常结束,向操作系统返回一个零值
} //函数结束
例1.3 给两个数x和y, 求两数中的大者
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=″<
return 0; //如程序正常结束,向操作系统返回一个零值
} //主函数结束
-
18 25 ↙ (输入18和25给a和b)
-
max=25 (输出m的值)
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=″<
return 0;
}
int max(int x,int y) //定义max函数
{
int z;
if(x>y) z=x;
else z=y;
return(z);
}
C 程序的结构特性
一个面向对象的C 程序一般由类的声明和类的使用两大部分组成。
典型的C 程序结构
//类的声明部分
class A{
int x,y,z;
……
fun( ){……}
……
};
//类的使用部分
int main()
{
A a;
……
a.fun();
return 0;
}
C++程序的编辑、编译和运行
C 源程序文件的扩展名为.CPP
C 对C的补充
1、注释与续行
-
注释符:“/*”和“*/” 或“//” 。
例如:
X = y z; //This is a comment
-
续行符:“\”(反斜杠)。作用是当一个语句太长时可以用该符号把它分段写在几行中。
例:
<< “u=” << u << “v\
=” << v << “w=” << w << endl;
2、输入输出流
C中I/O操作出现的问题:
float f;
scanf(“%f”,i);
printf( “%d”,d);
float f;
cin >> i;
cout << f;
例1.4 一个完整的C 程序
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的使用
void main()
{
int x=25;
cout << hex << x << ' ' << dec << x << ' ' << oct << x << '\n';
}
3、灵活的变量说明
定义变量的位置
-
在C语言中,全局变量声明必须在任何函数之前,局部变量必须集中在可执行语句之前。
-
Cpp中的变量声明非常灵活,它允许变量声明与可执行语句在程序中交替出现。
{
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、结构、联合和枚举名
在C 中,结构名、联合名、枚举名都是类型名。在定义变量时,不必在结构名、联合名或枚举名前冠以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、函数原型
C语言建议编程者为程序中的每一个函数建立原型,而Cpp要求为每一个函数建立原型,以说明函数的名称、参数类型与个数,以及函数返回值的类型。
-
函数原型语法的一般形式为:返回类型 函数名(参数表);
-
函数原型是一条语句,它必须以分号结束。
例1.6 函数原型的说明
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定义常量。
…………
s = 2 * PI * r;
…………
-
C 利用const定义正规常数
说明:
如:const int a=10; 表示定义了一个初始值为10的整型常量,它在程序中不可改变,但可用于表达式的计算中。
例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)指向常量的指针:一个指向常量的指针变量。
pc[3]=‘x’; //错误
pc=“efgh”; //允许
-
(2)常指针:把指针本身,而不是它指向的对象声明为常量。
pc[3]=‘x’; //合法
pc=“efgh”; //出错
-
(3)指向常量的常指针:这个指针本身不能改变,它所指向的值也不能改变。
pc[3]=‘x’; //出错
pc=“efgh”; //出错
说明
-
(1). 如果用const定义的是一个整型常量,关键词int可以省略。所以下面的两语句是等价的
-
(2). 常量一旦被建立,在程序的任何地方都不能再更改。
-
(3). 与#define定义的常量有所不同,const定义的常量可以有自己的数据类型,这样C 的编译程序可以进行更加严格的类型检查,具有良好的编译时的检测性。
-
(4). 函数参数也可以用const说明,用于保证实参在该函数内部不被改动,大多数C 编译器能对具有const参数的函数进行更好的代码优化。
例如:通过函数i_Max求出整型数组a[200]中的最大值,函数原型应该是:int i_Max(const int* ptr);
这样做的目的是确保原数组的数据不被破坏,即在函数中对数组元素的操作只许读,而不许写。调用时的格式可以是:i_Max(a);
7、void型指针
void 通常表示无值,但将void作为指针的类型时,它却表示不确定的类型。
void* pc; //正确,可以声明void类型的指针
int i=456;
char c=‘a’;
pc=