C++语言程序设计
第 3讲,更好的 C/5
运算符分类
1,算术运算符 加 (+)、减 (-)、乘 (*)、除 (/)、求余 (或称模运
算,%)、自增 (++)、自减 (--)共七种。
2,关系运算符 大于 (>)、小于 (<)、等于 (==),大于等于 (>=)、
小于等于 (<=)和不等于 (!=)六种。
3,逻辑运算符 与 (&&)、或 (||)、非 (!)三种。
4,位操作运算符 位与 (&)、位或 (|)、位非 (~)、位异或 (^)、左
移 (<<)、右移 (>>)六种。
5,赋值运算符 赋值 (=)、复合算术赋值 (+=,-=,*=,/=,%=)和复
合位运算赋值 (&=,|=,^=,>>=,<<=)三类共十一种。
6,条件运算符 用于条件求值 (?:)。
7,逗号运算符 用于把若干表达式组合成一个表达式 (,)。
8,指针运算符 用于取内容 (*)和取地址 (&)二种运算。
9,求字节数运算符 用于计算数据类型所占的字节数 (sizeof)。
10,特殊运算符 有括号 (),下标 [],成员 (->,.)等几种。
运算符优先级
括号
++,--,sizeof
*,/,%
+,-
==,!=
位运算
&&
||
,
赋值运算 =
逗号运算,
思考,
int x=1,y=0;
bool z = !x&&x+y&&++y;
Z =?


z ? (!x)&&(x+y)&&(++y)
? 0&&(1+0)&&(1) ? 0
#include <iostream>
using namespace std;
int main()
{ int year;
bool IsLeapYear;
cout << "Enter the year,";
cin >> year;
IsLeapYear = (( year % 4 == 0 &&
year % 100 != 0)||(year % 400 == 0));
if (IsLeapYear)
cout << year << " is a leap year,<< endl;
else
cout << year << " is not a leap year,<< endl;
}
例 2-2,输入一个年份,判断是否闰年
运行结果,
Enter the year,2000
2000 is a leap year
#include <iostream>
using namespace std;
int main()
{ int day;
cin >> day;
switch (day)
{ case 0,cout<<"Sunday"<<endl; break;
case 1,cout<<"Monday"<<endl; break;
case 2,cout<<"Tuesday"<<endl; break;
case 3,cout<<"Wednesday"<<endl; break;
case 4,cout<<"Thursday"<<endl; break;
case 5,cout<<"Friday"<<endl; break;
case 6,cout<<"Saturday"<<endl; break;
default,
cout<<"Day out of range Sunday,,Saturday"<<endl;
break;
}
}
例 2-4, 输入一个 0~ 6的整数,转换成星期
运行结果,
2
Tuesday
例 2-7, 用 do-while 语句编程
程序 1,
#include<iostream>
using namespace std;
int main()
{ int i,sum(0);
cin>>i;
while(i<=10)
{ sum+=i;
i++;
}
cout<<"sum="<<sum
<<endl;
}
程序 2,
#include<iostream>
using namespace std;
int main()
{ int i,sum(0);
cin>>i;
do{
sum+=i;
i++;
}while(i<=10);
cout<<"sum="<<sum
<<endl;
}
例 2-8, 用 for 语句编程
#include <iostream>
using namespace std;
int main()
{ int n,k;
cout << "Enter a positive integer,";
cin >> n;
cout << "Number " << n << " Factors ";
for ( k=1; k <= n; k++ )
if ( n % k == 0 )
cout << k << " ";
cout << endl;
}
运行结果 1,
Enter a positive integer,7
Number 7 Factors 1 7
运行结果 2,
Enter a positive integer,36
Number 36 Factors 1 2 3
4 6 9 12 18 36
关于宏定义
1,定义一个常量
? #define PI 3.1415926
? float x,y; x = PI/2.0; y = 3*PI;
2,定义一个带参数的表达式
? #define DISTANT(x,y) sqrt((x)*(x)+(y)*(y))
? float x,y,d; d = DISTANT(x,y);
3,字符串可以这样定义,
#define PRINT_MYNAME(myname) \
printf(“My name is = %s”,#myname);
4,字符串还能这样,
#define NEW_VARIABLE(newtype) \
var = Var_##newtype;
关于地址和指针
?地址( address)是数据在内存中存放的位置。
按字节编号。
?每个有效的变量都有 有效的 地址。
?在有效地址上存放的可能是别的地址的值。
? 设 ? 为等价于(数值相同)的意思。
? 例如 设 a的地址是 A,A = &a; 则 a ? *A;
? 另有变量 b的地址 B(b ? *B)存放了地址 A的值
? *B = A; 则 *B ? &a 即 b ? &a 或 *b ? a
? 因此 a ? *(&a) ? *A ? *(*B) ? *b
? 所以 b 是指向 a的 指针!
?例,int a; int* b; b = &a; a = 10;
?这时,*b ? 10
?指针是记录别的变量的地址的变量。
a A
b=A B
更好的 C
?1,C++的单行注释
? C代码中只能是,/* This is a multi-line comment,*/
? C++代码增加,// This is a single-line comment,
?2,C++的输入 /输出流
?C代码,
? printf(“Enter new tag:”); // 打印输出
? scanf(“%d”,&tag); // 等待输入
? printf(“Tag is,%d\n”,tag); //打印输出
?C++代码,
? cout <<,Enter new tag:”; // 输出流
? cin >> tag; //输入流
? cout <<,Tag is:” << tag << ?\n?; // 输出流
更好的 C
?3,C++中的声明 (变量 )
? C代码,函数体的执行语句之前(头部),
int i;
for(i=0;i<=5;i++)
printf(,%d\n”,i );
? C++代码,函数体的任何地方,如
for(int i=0;i<=5;i++)
cout << i << ?\n?;
?4,在 C++中建立新的数据类型
? C代码,enum,struct,union不是新的数据类型。
? C++代码,enum,struct,union,class是新的数据类型。
// data type declare
enum Boolean { FALSE,TRUE };
struct Name {
char first[10];
char last[10];
};
union Number {
int i;
float f;
};
enum,struct,union作为数据类型
// 在 C中的用法,
enum Boolean done;
struct Name student;
union Number x;
// 在 C++中的用法,
Boolean done = FALSE;
Name student = {,zhang”,”wang” };
Number x = { 21,39.3 };
?5,函数原型和类型检查
? C代码,函数原型不是必须的;
? C++代码,函数原型必须有,如 int aquare(int);
? C代码,int print(void); // void 必须写
? C++代码,int print(); // void 可省略
?6,内联函数
? C代码,没有。
? C++代码,inline int Function();
?内联函数与宏定义比较
相同的地方,编译时嵌入程序中。
不同的地方,内联函数的编写与普通函数一样,也可以跟踪;
但宏定义只是作替换,与函数不同,并不能跟踪。
7,引用 Reference
? C语言中不存在,C++新加的概念。
? int a = 10;
? int* pa = &a;
? int& ra = a; // the reference of ?a?
? ra 和 a 共用一个地址。
? pa 是指向 a 的指针; ra 是 a 的一个别名。
? 如果 a = 20 则 *pa 与 ra 都为 20。
a pa = &a
1 2 … &a … &pa … Addr,
Value,
pa
&a ? pa ? &ra
a ? *pa ? ra
&ra
7,引用 Reference
?函数的调用方式,
?传值调用,
? void Function(int a) { a = 10; }
?传指针调用,
? void Function(int* pa) { *pa = 10; }
?传地址调用,
? void Function(int& ra) { ra = 10; }
// 传值调用
int squareByValue(int a)
{
return a *= a; // 不修改调用者的参数
}
// 指针调用
void squareByPointer(int* bPtr)
{
*bPtr *= *bPtr; // 修改调用者的参数
}
// 引用调用
void squareByReference(int& cRef)
{
cRef *= cRef; // 修改调用者的参数
}
引用的特点
1)引用变量是被引用变量的, 别名, 。即共用一个地址。
2)以 引用 作形参的函数的调用方式与 传值 调用写法相同,
但 传值 不会影响到外部,而 引用 则会影响参数在外部的
值。
3)在函数中,传值 调用传的是参数的值;而用 引用 调用传
的是参数的地址。
4)引用可以用指针代替,但指针不能完全被指针代替。比
如链表、直接内存寻址、修改地址等。但指针不安全,
而引用比较安全。
JAVA和 C#为保证安全性都禁止使用
指针,只能用, 引用, 。
8,const限定符
?C代码,没有。
?C++代码,
? const float PI=3.14159
? const int* iPtr = &integer;
1)常量必须初始化 ;(声明时赋值)
2)常量不能修改。
?与宏定义不同,const修饰的是变量;而宏仅仅
作替代而已。
9,动态分配内存
? C代码,
typeName* ptr; int num=10;
ptr = malloc(sizeof(typeName)*num); // 申请
free(ptr); // 释放
? C++代码,
ptr = new typeName[num]; // 申请
delete ptr; // 释放
? C语言中是调用函数,C++中是运算符。
? 初始化新分配的内存
float* tingPtr = new float(3.14159);
delete tingPtr;
? 动态建立数组
int* arrayPtr = new int[100];
delete[] arrayPtr;
?10,默认参数
inline int boxVolume(int length=3,int width=2,int height=1)
{ return length*width*height; }
? 调用该函数时,可以有以下几种方法,
1) boxVolume(); // length=3,width=2,height=1
2) boxVolume(10); // length=10,width=2,height=1
3) boxVolume(10,5); // length=10,width=5,height=1
4) boxVolume(10,5,2); // length=10,width=5,height=2
?11,单目作用域运算符
float value = 1.2345;
int Function()
{ int value = 7;
float f =,:value; // 取外部的值
int v = value; // 取内部的值
}
则 f = 1.2345 v = 7;
C++编译器
?Microsoft Visual C++ 6.0
?bloodshed dev-c++,使用 gnugcc 编译,
可以和 cygwin等基于 gcc的编译器。
?正式版本最新 4.9.9.2
?http://www.bloodshed.net/devcpp.html
?