首页
社区
课程
招聘
[原创]c++和pascal
发表于: 2007-2-24 16:39 9742

[原创]c++和pascal

2007-2-24 16:39
9742

c++和pascal
kflnig又名狂枫
我本来是一个PASCALer,可是由于某种原因,转型到了c++。了解到,PASCAL和c++还是有很多区别,所以写了这篇文章。
C++:
#include <iostream.h>
void main()
{int n;
for(n=0;n<=10;n++) continue;
cout<<n;
}
    PASCAL:
var n:integer;
begin
for n:=1 to 10 do
continue;
writeln(n);
end.
    别小看了上面一点,这个可让我吃透了苦头。c输出11,PASCAL输出10。
    在这一点上,我只能说是c++不人性化。
    还有一点就是局部变量和全局变量的问题。也是很头痛。
    在c++中不是main函数中定义的就是全局变量,在PASCAL中在主程序中定义的就是全局变量。在c++中若要定义全局变量,就要把定义放在最前面。举个例子
long t1,t2;
int Fun()
{
}
void main()
{
}
    这里的t1,t2是在这两个函数中都可以用。
    要说c语言的最大不足就是字符串了。我……
不能和PASCAL比
    char a;
    a=“b”;
  这是对的吗?答案是错的。不能把一个字符串常量赋给一个字符串变量。应该改成a= ‘b’;这什么道理吗?
    在PASCAL中多好,一个STRING就万事OK!咱么再看一个
    char *pl;
    pl= “abc”;这样对吗?答案是对的。
  看到我的《c++程序语言设计(学生用书)》这样写着,“c++的基本数据类型中没有字符串类型,本章用字符数组处理字符串的方法。这是从c语言延续过来的方法,但并不是一个好的方案,在c++程序中建议使用c++的标准库的string类。”对于处理字符串,我只有一句话想说,在我头脑清醒时,如果可以使用DELPHI或者PASCAL处理字符串我绝对不用C。
    我自己算是学习了,花了我半个小时啊!如果你不知道下面的知识,那么你有福了,只要5min。一点c字符串的知识,给大家作为新年的礼物!我是看着手边的《c程序设计》谭浩强主编,和《c++程序语言设计(学生用书)》的指导下完成的。
char a;
    a=“b”;
从前面我们已经知道上面的定义是错误的。c++在编译时提示错误如下:
error C2440: '=' : cannot convert from 'char [2]' to 'char'
    这是为什么呢?c语言在字符串结尾都有一个\0的标志,所以“b”,就等于 ‘b’和 ‘\0’所以只能容纳一个字符变量的a不足以容纳两个值。
    所以在c中的处理字符串的方法是使用字符数组。数组中每一个元素存放一个字符。
    字符数组初始化
    char c[10]={‘L’, ‘O ’, ‘V ’,‘E’}从c[4]开始后面的6个自动填充为\0。
    这样定义还是很累的。
    比较简单的是这么写。
    char c[10]={“LOVE”};
    也可以省略外面的花括号直接写成char c[10]= “LOVE”;可假如你写成char c[4]= “LOVE”;那么就错了,char c[5]= “LOVE”;而这样却是对的。为什么呢?因为\0。
    那么你有没有想过在VC中strlen(c)为多少呢?答案是4,在用strlen计算字符串长度的时候它不会把\0计算在内。
    那么现在你肯定很想知道怎么输入字符串了。输入字符串其实比想想中的简单。
    char c[10];
    cin>>c;
    cout<<c;
    比我原来想象中的要来个循环简单的多了。
    现在还有很多要介绍的,字符串连接,字符串复制。
    char a[100]="i am happy",b[100]=" today";
        strcat(a,b);
        cout<<a<<endl;
    cout<<b;
    输出的是
“i am happy today
today”,我写这个主要是为了告诉你,strcat连接字符串之后,会把第二个字符串连接到第一个字符串的末尾。而第二个字符串数组不会变。但是如果你要连接三个字符串数组的话,没有办法,只好一步步来了strcat只支持2个。
  下面是strcpy和strncpy。别看错,后面一个多了一个n。
  strcpy(str1,str2);假如str1够大的话,那么str2的字符串就复制给了str1一份。
  strncpy(str1,str2,2);
  str2中的前两个字符赋给str1。
  当然要使用上面的这些函数你必须在vc中加上一句#include <windows.h>
  看着上面的东西,你也许会说,c中的字符串处理也不过如此,很简单吗!
  可是当,字符串遇到指针一切就变了。至少我先是傻了一回眼!
  char *str="LOVE";
        cout<<str<<endl<<*str;
  你知道会输出什么吗?是
LOVE
L
  很正常,用这句语句cout<<sizeof(str)<<endl<<sizeof(*str);我们得到str的大小是4bytes,而*str的大小是1byte。str指向字符串LOVE的首地址,也就是L的地址。所以*str中就储存的是L了。
  cout<<strlen(str);很容易想到就是4了。
  我们在往vc中输入代码的时候它是这么提示的:strlen (const *char);
  看到这里希望你不要问我char *str="LOVE";等价于
char *str;
str= “LOVE”;
为什么,没有把str的值变成, {‘L’, ‘O’, ‘V’, ‘E’ ,‘\0’}你上面不是这么说的吗?
我想编译器还是有一点智能的吧!
既然两者都可以实现字符串,那么区别呢?加入#include <stdio.h>
char c[5]= "LOVE";
char *str="LOVE";
printf("%x,%x",&c[0],str);
我想这句话很好的说明了区别。字符串数组c有其自己的地址。而str是引用了LOVE在内存中的地址。不难,不难!到这里我还是这么认为,可是一旦综合起来……
char str[100];
str= “LOVE”;
对吗?错!
char str[100];
str[]= “LOVE”;
还是错!
char str[100]
cin>>str;
对吗?对了!
char *str;
cin>>str;
对吗?非常错,不想死就不能这么写。
  至于上面所说过的string类,我现在还不知道那是什么东西。知道的朋友不要吝啬,贴出来吧!
  C++中的语法定义很多,真的不是一门一下子就可以掌握的语言。
    我用DELPHI 8写了个DLL供c++调用,专门用来做这种事情(一般情况下没有这个必要)。如果你的技术高一点,可以让那个DLL出现的不见踪影,我没有这种技术,希望你懂得我在说什么。c和c++的区别都被说烂了,但是对于像我这种,不是靠编程来吃饭的家伙,用c++只有几个好处
1、        cin,cout
2、        const
3、        new,delete
4、        void
这些是c++相对于c最实用也是很方便的。到最后问个问题,我想使用strncpy函数,既可以#include <windows.h>又可以#include <string.h>那么我到底是使用那个好呢?
本来希望写着教程中迎来新年的……
提醒大家一点,在使用VC6.0的时候新建工程,注意建立控制台应用程序,而不要建立win32应用程序。否则你会无法BUILD至少我这里是这样的。


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 7
支持
分享
最新回复 (11)
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
for(n=0;n<=10;n++)

for n:=1 to 10 do

一个从0开始,一个从1开始,循环次数不同,当然输出不同了
2007-2-24 19:03
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
我也是用pascal的  lz的东西收下了 免的走弯路
2007-2-26 19:02
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
NIU
4
最初由 fengyun 发布
for(n=0;n<=10;n++)

for n:=1 to 10 do

一个从0开始,一个从1开始,循环次数不同,当然输出不同了

不是这个原因

C规定自增或自减运算符要等前语句块执行完成之后才当执行,也就是说等continue完成后才执行n++,最后一次continue时n=10,再自加当然是11了
2007-2-27 22:26
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
NIU
5
<string.h>里的函数是strncpy,在msvcrXX.dll里(XX是版本号)
<windows.h>里的是lstrcpyn,在kernel32.dll里

前者是C库,后者就不用多说了吧
2007-2-27 22:37
0
雪    币: 235
活跃值: (100)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
先入为主的原因。。。。。。。

如果你先学习的是C++,你会发现这一切是多么的自然。。。
2007-2-28 00:40
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
我正好是学c以前学过pascal这对我来说,非常有用.谢谢.
2007-2-28 08:06
0
雪    币: 390
活跃值: (707)
能力值: ( LV12,RANK:650 )
在线值:
发帖
回帖
粉丝
8
在我看来,c/c++语言唯一的好处就是可以方便地编写驱动程序,或者拥有大量的3rd library
2007-2-28 09:05
0
雪    币: 217
活跃值: (99)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
C/C++表面上明显的好处是同样的算法,代码的字符数少,敲击键盘次数少,写程序快,读程序快.
2007-2-28 11:57
0
雪    币: 3758
活跃值: (3337)
能力值: ( LV15,RANK:500 )
在线值:
发帖
回帖
粉丝
10
D写驱动可以用三方的工具集DDDK.
sys本来就是pe文件, 由于某些原因, borland的c++和pascal都不能产生这个玩艺, 或者可以说是不敢产生吧.
C的第三方库和头文件, Jedi项目已经有不少移植了, 大多是基于dll的API的, 我也移植了一些对应于C的静态lib的obj版, 这个至少做注册机所需要的PNGLib和ufmod等有Delphi的obj版有了, 从02年开始转用KOL大概五年了, 主要的感想就是使用这种非VCL相关的编码方式可以很容易的在C++和asm之间移植和混合编译编码.
C的字串方式是个假装内置数据类型的类, 和pascal字串是完全不同的.
之前因为对C++这些语言不懂, 一直只会用asm, 对我来说, 并不觉得C++是多么自然的东西, 使用pascal的时候也是多用功能少用类, 视类为程序结构的大敌, 但是上班时候, 要使用什么语言, 要使用什么风格的编码方式, 都不由自己决定, 老板让怎么换就怎么来, 除了之前的老板要求将某程序移植到asm然后画出单步流程图这种要求实在不能完成, 否则干活就是了, 哪有什么人关心你觉得顺不顺手
2007-3-2 14:51
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
for(n=0;n<=10;n++) continue;
cout<<n;

当然输出 11 ,不过如果你改为

for(n=0;n<10;n++) continue;
cout<<n;

输出就会是10了,
2007-3-2 22:19
0
雪    币: 207
活跃值: (12)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
12
谢谢楼主,学习,学习...
2007-3-6 07:52
0
游客
登录 | 注册 方可回帖
返回
//