Pascal 转C++ 学习笔记
1. 基本知识
版本:201103202311
本文内容遵从CC版权协议 转载请注明出自WanderingDream(www.WanderDream.com)
本文总目录地址: http://www.WanderDream.com/?p=124
本文概述(主要内容):
C++ 的初步知识、常量、变量、 c++ 的运算符、算术运算符与算术表达式、赋值运算符与赋值表达式、逗号运算符与逗号表达式。
您可以运用搜索( ctrl+f )快速找到您想查到的,而不是一个一个浏览。
正文:
C++ 的初步知识:
这里您会看到一些杂七杂八的东西 …..
标准 c++ 规定 main 函数必须声明为 int 型。如果程序正常执行,则向系统返回数值 0 ,否则返回 -1.
C++ 标准库中的类和函数实在命名空间 std 中声明的,因此程序要用到 c++ 标准库,就需要用“ #include ”和“ using namespace std ”
endl 是 c++ 输出时的控制符( end line 的缩写)
对函数的声明:“ int max(int x,int y); ”这就相当于定义一个名为“ max ”的变量似的。这里只介绍个大概,具体的在下一章函数部分详尽说明。
在 c 语言中头文件用 .h 作为后缀,但 ANSI C++ 建议头文件不带 .h 后缀。
什么是连接程序?将一个程序的所有目标程序和系统的库文件以及系统提供的其他信息连接起来,最终成为一个可执行的二进制文件,它的后缀是 .exe 。
数据类型与表达式:
这里您将看到:常量、变量、 c++ 的运算符、算术运算符与算术表达式、赋值运算符与赋值表达式、逗号运算符与逗号表达式。
C++ 中的数据类型:
基本类型: short int , int (相当于 pascal 的 integer ), long int (个人感觉像 longint ), char , float , double , long double , bool (相当于 pascal 的 boolean ), void (空类型)
非基本类型: enum (枚举类型), type[] (数组类型), struct (结构体类型), union (共用体类型), class (类类型), type * (我暂时也不知道它干什么,鄙视我吧 …. )
指针类型
无符号的前缀“ unsigned
以上的这些数值范围和字节数因为 IDE 不同实际值不同,我就不写出来了。
0x20 (数字 0+ 英文 x )表示这是 16 进制数的 20 ,十进制数的 32.
020 (数字 0 )表示八进制数的 20 ,即 10 进制数的 16.
F 或 f 表示单精度浮点数
用字母 e 表示的其后的数是以 10 为底的幂,如 e12 表示 10^12
指数形式存储时按:
数符( + 、 - ) + 数字部分( .314159 ) + 指数部分( 3 )
其中数字部分必须小于 1 ,同时小数点后面的第一个数字必须是一个非 0 的数字。
Eg:314.159 314.159e0 31.4159e1 3.141592e2 0.314159e3 在内存中都表示为 0.314159e3
转义字符:
什么是转义字符?总的来说就是你直接打印不出来的。下面列举:
字符形式 |
含义 |
ASCII 代码 |
/a |
响铃 |
7 |
/n |
换行 |
10 |
/t |
水平制表(跳到下一个 tab 位置) |
9 |
/b |
退格,将当前位置移到前一列 |
8 |
/r |
回车 |
13 |
/f |
换页,当前位置移到下页开头 |
12 |
/v |
竖向跳格 |
8 |
// |
输出反斜杠字符“ / ” |
92 |
/’ |
输出单引号字符 |
39 |
/” |
输出双引号字符 |
34 |
/0 |
空字符 |
0 |
/ddd |
1~3 位 8 进制所代表的字符 |
|
/xhh |
1~2 位 16 进制数代表的字符 |
|
注意: /ddd 中 d 代表数字。 Eg : cout<<’/141’; 既是输出 a 。
/xhh 中 x 不变, h 代表数字。 Eg : cout<<’/x61’; 既是输出 a 。
另外,这里的转义字符在输出时都要加上单引号: cout<<’/141’; ,不然会报错。
转义字符虽然包含 2 个或多个字符,但它只代表一个字符。编译系统会直接找 / 后面的字符,把它处理成一个字符,在内存中占一个字节。
字符常量:
用单撇号括起来一个字符就是字符型常量,如 ’a’ , ’#’
字符型常量职能包括一个字符。
注意 c++ 中单撇号和双撇号是不同的,双撇号表示字符串。单撇号表示字符常量,这里和 pascal 中的所有都用单撇号不同。
字符串常量:用双引号括起来的就是字符串常量。
“ abc ”在内存中占 4 字节而不是 3 字节,因为系统会给他最后加上“ /0 ”作为结束标志。
即: a b c /0
“ a ”是字符串, ’a’ 是字符。
看下面这段程序:
char c;
c=”a”;
这就会报错,因为 c 是 char ,而“ a ”是字符串。
如果在一个字符串中最后一个字符为 / ,则表示续航。
Eg :
cout<<”We must study C/
++ hard!”;
输出的是:
We must study C++ hard!
#define PRICE 30 // 注意这不是语句,末尾不加分号
变量命名规则:
C++ 中规定标识符只能由字母、数字和下划线 3 种字符组成,且第一个字符必须为字母或下划线。
大写字母和小写字母被认为是两个不同的字符。
一般变量名用小写字母表示,常习惯在变量名前加一个字母表示该变量的类型。 Eg : iCount 表示这是一个 int 型。这成为匈牙利命名法。
呃 … 我插叙一下。在 pascal 中因为类型是硬性的无法转换,所以如果类型不统一就会报错,但 c 和 c++ 不是,所以 pascal 中一般不用前面加类型(至少我是这样),但显然 c 和 c++ 中应该加,不然很容易因为忘了类型而赋值错误,发生莫名其妙的错误。同时,在前面加个类型也在提醒我们赋值时我们有没有赋错。
定义变量, eg :
float a,b,c,d;
int a,b,c;
可以在定义变量时赋初值。 Eg :
Float a=83.5,b,c=64.5;
这里 a 、 c 有初值, b 没有。
C 、 C++ 和 pascal 一样,要求使用变量前先定义。
较为麻烦的有求余运算:
% 是求余,得到 a/b 的余数。 a 、 b 任意一个为实型变量,则不允许进行求余。换言之,求余是整数间的运算。
赋初值可以用以下方法:
int a,b,c=1;
a=b=c;
注意,赋值运算符是自右向左的,所以如果用 c=a=b; 则相当于把 c 变得也没有初值了(在 vs2010 中这会报错)。
Eg :
int a,b,c=1;
a=b=c;
int e,f,g=1;
g=e=f;
cout<
这段程序会输出:
1 1 1
-858993460 -858993460 -858993460
现在你知道厉害了吧 ….
数学库文件在 c++ 中叫“ cmath ”( math.h )
另外还有常变量这个概念。常变量和常量不同,常变量在内存中占空间,而常量在内存中不占。(书上说常变量先进,大家喜欢用这个,我怎么觉得还是常量好啊? …. 还不费内存 …. )
C++ 的运算符:
这里只列举出来跟 pascal 不一样的。
/ 除(转义字符是 / ,回车上面那个, / 是问号那个键)
% 求余
== 等于
= 赋值
!= 不等于
&& 逻辑且
|| 逻辑或
! 逻辑非
& 按位与
| 按位或
^ 按位异或
~ 按位取反
* 指针运算符
& 引用运算符和地址运算符(呃 … 我记得地址运算符不是 @ 吗? …. 囧,谁能帮帮我 …. )
sizeof 求字节数运算符
-> 指向成员运算符
算术运算符与算术表达式:
这里要注意的很多 ….
这里说一下除运算“ / ”。这个符号很强大,把 pascal 中的整除和 / 都包括了。我的理解是 / 左右两边都是整形时是整除,两边只要有一个是实型就是普通的除。 不知道对不对,大家拍砖 …..
/ 号如果进行整除且两边之中有负数,这时小数部分舍入方向是不固定的,多数编译系统会采取“向零取整”的方法。 Eg : -5/3 的值等于 -1 (不是商 -1 就是 -2 ,这里向 0 靠拢,就是 -1 ,即我们大家平时的思维习惯),大家注意。
另外,参加加减乘除运算的两个数中只要有一个是实型,则运算结果也是实行( double )。
在进行运算时,不同类型的数据要先转换为同一类型,然后进行运算。转换方法:
这个是系统自动进行的。
自增自减运算:
++i :在使用 i 之前先将 i 的值加 1 。 Eg : i=3 ; j=++i ; j,i 的值为 4
I++ :在使用 i 之后使 i 的值加 1 。 Eg : i=3 ; j=i++ ; j 的值为 3 , i 的为 4
++ 和 — 的结合方向是自右向左
注意:
int i=3;
cout<
输出的是 4 3
这是因为许多编译系统在处理输出流时,先按自右向左的顺序对各输出项求值。
还有:
int i;
i=3;
i=(i++)+(i++)+(i++);
cout<
这段程序输出的是 12
因为大多数编译系统把 3 个 i 的值都当做 3 ,先 3 个 i 加然后再 3 次自加(我的理解是因为 i++ 表示 i 用完后再加,所以 ….. )
强制类型转换运算符:
在 c 中:
(double) a; (将 a 的值转换为 double )
(int) (x+y); (将( x+y )转换为整形)
总的来说形式是: ( 要把表达式强制转换成什么类型的那个类型名 )( 表达式 )
在 c++ 中:
int(x);
int(x+y);
总的来说是:要把表达式强制转换成什么类型的那个类型名 ( 表达式 )
说上推荐用 c++ 的,这次我无异议。其实大家可以把 int(x) 理解为一个函数, x 为实参,我们要的是函数返回值。
要说明的是强制转换实际是产生一个中间变量,转换后原来的变量类型并没变(可以用函数理解,返回值改变,实参值没变)。
赋值运算符:
这里有几条运算规则 ;
1. 将浮点型数据赋值给整型变量时,舍去小数部分,以整数形式存储。注意是舍去,不是四舍五入。 Eg : 3.56 舍去后是 3
2. 将整形数据赋值给浮点型变量时,数值不变,但以浮点型数据方法(指数)存入变量。 Eg : float f ; f=23 ;则将 23 以单精度存入 f , double 同理推测。
3. 将一个 double 赋值给 float 时,要注意溢出问题。
4. char 型赋值给整数型,则是将 char 的 ASCII 码赋值给整形。
5. 将一个 int 、 short 、 long 型数据赋给一个 char ,只将其低 8 位原封不动的送到 char 型变量。
6. 将 signed 型数据赋给长度相同的 unsigned 型变量,将存储单元内容照搬(包括符号位)。
不同类型的整型数据间的赋值实际是按存储单元中的存储形式直接传送。
-1 的补码为 1111111111111111.
复合的赋值运算符:
这是区别与 pascal 的部分。
在赋值运算符之前加上其他运算符可以构成复合的运算符。(凡是二元运算符都可以)
a+=3 等价于 a=a+3 ;
x*=y+8 等价于 x=x*(y+8) ,注意不要认为是 x=x*y+8 ;
c++ 可以使用以下复合赋值运算符:
一般: +=,-=,*=,/=,%=
位运算中: <<=,>>=,&=,^=,|=
赋值表达式:
赋值表达式中的表达式可以又是一个赋值表达式。 Eg :
a=(b=5);
相当于 b=5;a=b;
赋值运算符是自右至左的。
a=(b=5)/(c=2)
其中 a 值为 5 。因为赋值运算符的右结合性。
赋值运算符也可以包含复合的赋值运算符。 Eg :
a+=a-=a*a
以赋值符号为划分。
先执行 a-=a*a;
再执行 a+=a
逗号运算符与逗号表达式:
赋值运算符的优先级别高于逗号运算符。逗号运算符是所有运算符中级别最低的。
Eg : a=3*5,a*4
先求解 a=3*5 , a 为 15
再求解 a*4 ,为 60 ,整个逗号表达式的值为 60.
再如:
(a=3*5,a*4),a+5
这时, (a=3*5,a*4) 算出为 60 ,但 a 值仍未 15 (未赋值),所以表达式值为 15+5=20 。
逗号表达式的一般形式:
表达式 1 ,表达式 2 ,表达式 3 , …. ,表达式 n
逗号表达式的值为表达式 n 的值,即最后一个表达式的值。
我们再看一个程序:
int a;
(a=3*5,a*4);
这是可以运行的,输出值为 15
所以有很多人就用它来当“ { } ”,即一个语句可以放很多语句。
比如 for (i=1;1;i++,i--,i=i+1,….. 表达式 n) 这样 for 语句就不用循环体了 ……..
逗号表达式是把若干个表达式串联,在许多情况下并不是为了得到表达式的值,而只是想同时执行其中的若干个表达式(得到各个表达式的值)。
总字数: 3609