首页 > 学技术 > 技术网文 > C/C++ > 正文

[保留] 谁能说说这两段程序的区别?


来源 chinaunix.net kuqin整理

程序 1

#include <stdio.h>
main()
{
 float a[2][3],x;
 int i,j;
 for(i=0;i<2;i++)
  for(j=0;j<3;j++)
   {scanf("%f",&x);
    a[j]=x;
         }
}

程序 2

#include <stdio.h>
main()
{
 float a[2][3];
 int i,j;
 for(i=0;i<2;i++)
  for(j=0;j<3;j++)
   scanf("%f",&a[j]);
}

很低级不?高手表笑哈,喝杯茶,慢慢回帖。。。



 lanying_wzw 回复于:2007-02-13 09:08:54

没什么区别


 3040602024 回复于:2007-02-13 13:19:36

呵呵,水平太烂真没看出有什么区别


 bitmilong 回复于:2007-02-13 13:51:19

如果输一个字母再输一个回车两段程序的反应如何?


 langue 回复于:2007-02-13 14:50:50

我试过了,没发现区别。

















 wolf0403 回复于:2007-02-13 15:02:16

应该没有区别,除非是特定编译器的特定 BUG。。(VC6的浮点数 bug?)


 mingyanguo 回复于:2007-02-13 15:24:23

引用:原帖由 langue 于 2007-2-13 14:50 发表
我试过了,没发现区别。 


orz


 bitmilong 回复于:2007-02-13 15:24:53

是呀,没区别楼主在问啥捏

程序2比程序1少用个变量


 langue 回复于:2007-02-13 15:47:44

引用:原帖由 mingyanguo 于 2007-2-13 15:24 发表

orz 



引用:[font="Courier New"]bash-2.05$ ./t1
1
1.000000
2
2.000000
3
3.000000
4
4.000000
5
5.000000
6
6.000000
bash-2.05$ ./t2
1
1.000000
2
2.000000
3
3.000000
4
4.000000
5
5.000000
6
6.000000
bash-2.05$[/font]




 namei 回复于:2007-02-13 17:16:26

没有区别???我看的是这里:http://www.yesky.com/20011224/211309_1.shtml
继续等待。。。:mrgreen:


 思一克 回复于:2007-02-13 17:26:33

书是人写的。人有时会自做多情的。

不知道那作者的意思


 namei 回复于:2007-02-13 17:31:31

引用:原帖由 思一克 于 2007-2-13 17:26 发表
书是人写的。人有时会自做多情的。

不知道那作者的意思 



自作多情??怎么说?


 hake2000 回复于:2007-02-13 18:22:57

赞同


 飞灰橙 回复于:2007-02-13 18:27:23

误人子弟,抽!


 win_hate 回复于:2007-02-13 18:40:30

如果没有记错,这个例子应该能说明 TC2.0 有一个 bug.  

没有变量 x 的那段代码在 TC 2.0 中会出错,但也许是默认配置造成的。

无论如何,这不是 C 的问题。

[ 本帖最后由 win_hate 于 2007-2-13 18:43 编辑 ]


 cobras 回复于:2007-02-13 18:42:05

栈需求量不同?二进制代码不同?运行时间不同?……有毛哦。


 langue 回复于:2007-02-13 18:53:46

引用:原帖由 win_hate 于 2007-2-13 18:40 发表
如果没有记错,这个例子应该能说明 TC2.0 有一个 bug.  

没有变量 x 的那段代码在 TC 2.0 中会出错,但也许是默认配置造成的。

无论如何,这不是 C 的问题。 



我也觉得是这样。第一段程序,除了多出个中间变量 x 用来存储 scanf() 获得的值以外,语义上和第二段没有什么区别。结果也表明,两个程序的运行效果是基本相同的。

--


 namei 回复于:2007-02-13 20:30:42

引用:原帖由 win_hate 于 2007-2-13 18:40 发表
如果没有记错,这个例子应该能说明 TC2.0 有一个 bug.  

没有变量 x 的那段代码在 TC 2.0 中会出错,但也许是默认配置造成的。

无论如何,这不是 C 的问题。 



原来如此。MD,没上下文,给害了 :evil:


 lenovo 回复于:2007-02-13 22:45:43

引用:原帖由 win_hate 于 2007-2-13 18:40 发表
如果没有记错,这个例子应该能说明 TC2.0 有一个 bug.  

没有变量 x 的那段代码在 TC 2.0 中会出错,但也许是默认配置造成的。

无论如何,这不是 C 的问题。 


用TC系统编写小程序时,如果程序里用到浮点输入,有时运行中会出现下面错误信息: 

scanf : floating point formats not linked 
Abnormal program termination 

这个错误信息的意思是:scanf的浮点格式转换程序没有连接。 

TC开发时(80年代)DOS下的存储资源紧缺,因此TC在编译时尽量不加入无关部分。
在没发现需要做浮点转换时,就不将这个部分安装到可执行程序里。
但有时TC不能正确识别实际确实需要浮点转换,因此就会出现上面错误。 

解决方法:设法告诉TC需要做浮点数输入转换。例子里增加了一个float变量并用它输入。 

大程序里由于变量很多,只要有了线索,TC就会把浮点转换连上,因此反而不常遇到这个问题。


 feiyang21687 回复于:2007-02-13 23:47:40

本人愚见:第一个main()函数如果输入非法,那么会把随机的x值赋给a[j]。


 思一克 回复于:2007-02-14 09:23:23

我说的“自做多情”意思就是写书的人情感丰富,自己搞一些误人子弟的结论写上。
win_hate说是TC2。0的BUG,那就可能是写文章的人用TC而没有用过其它的造成的。


 win_hate 回复于:2007-02-14 10:00:14

引用:原帖由 思一克 于 2007-2-14 09:23 发表
我说的“自做多情”意思就是写书的人情感丰富,自己搞一些误人子弟的结论写上。
win_hate说是TC2。0的BUG,那就可能是写文章的人用TC而没有用过其它的造成的。 




嗯,从原文看,作者说的是从 C 的角度看,两段代码有区别。但实际上只是编译器的问题。


 思一克 回复于:2007-02-14 10:02:25

win_hate, 好像作者说第2中不行。如果真不行,那就是你说的TC的问题。


 win_hate 回复于:2007-02-14 10:08:24

引用:原帖由 lenovo 于 2007-2-13 22:45 发表

用TC系统编写小程序时,如果程序里用到浮点输入,有时运行中会出现下面错误信息: 

scanf : floating point formats not linked 
Abnormal program termination 

这个错误信息的意思是:scanf的浮点格式 ... 




我原来一直猜测有命令行参数可以调整这种行为,但现在没有 TC 了,也试不了。不知到把优化参数去掉或加入调试参数后情况如何。

以下是  comp.lang.c FAQ 对这个问题的解释:

引用:
15.6: I'm having trouble with a Turbo C program which crashes and says
something like "floating point formats not linked."

A: Some compilers for small machines, including Turbo C (and
Ritchie's original PDP-11 compiler), leave out floating point
support if it looks like it will not be needed.  In particular,
the non-floating-point versions of printf and scanf save space
by not including code to handle %e, %f, and %g.  It happens that
Turbo C's heuristics for determining whether the program uses
floating point are insufficient, and the programmer must
sometimes insert an extra, explicit call to a floating-point
library routine to force loading of floating-point support.



现在的编译器不再有这种问题了。如果没有特别的理由,还是不要去折腾这些上了年纪的编译器啦,让它们安息吧。


 win_hate 回复于:2007-02-14 10:11:56

引用:原帖由 思一克 于 2007-2-14 10:02 发表
win_hate, 好像作者说第2中不行。如果真不行,那就是你说的TC的问题。 



是啊,有 x 的那个可以。没有  x 的会崩溃。:em06:

我学 c 的时候,用的也是 tc, 这个问题好象就没碰到过。:D


 nokuta 回复于:2007-02-14 13:14:42

引用:原帖由 namei 于 2007-2-13 17:16 发表
没有区别???我看的是这里:http://www.yesky.com/20011224/211309_1.shtml
继续等待。。。:mrgreen: 




http://www.yesky.com/20011224/211309_1.shtml 这个链接的文章纯粹是放狗屁,看得我简直想抽那个作者一顿……

引用一下其精彩言论:

1、就本人实践所得,其实高级程序语言分为两大语系。一路是以C为主的程序语言,例如:JAVASCRIPT,JAVA 等,这类语言在函数的调用,程序语句的书写,循环的控制都极为相似。另一路是以BASIC为首的程序语言,例如:FOXPRO,VBSCRIPT等,此类语言同样具有相似的函数调用,程序语句书写以及循环控制,但与C语系是不同的。

2、另外,在编写一个程序时,除非万不得已,一般不要使用指针变量。因为指针是比较复杂的,用不好就“当机”。所以笔者建议各位对于指针只要能看懂就行,当然如果你是准备参加考试的就另当别论了。

3、C++是一门建立在C语言上,但又不同于C语言的高级程序语言,它增添了很多函数。


 langue 回复于:2007-02-14 13:18:57

引用:3、C++是一门建立在C语言上,但又不同于C语言的高级程序语言,它增添了很多函数。


这个最可笑,也最明显,简直 “言简意赅” 到极点了……:lol


 飞灰橙 回复于:2007-02-14 13:43:57

引用:
欢喜的是,C语言功能非常强大、应用广泛,一旦掌握了后,你就可以理直气壮地对他人说“我是电脑高手!”



:em06::em06::em06::em06:


 Edengundam 回复于:2007-02-14 13:52:10

这文章有点古老...这句实在...汗......

2、另外,在编写一个程序时,除非万不得已,一般不要使用指针变量。因为指针是比较复杂的,用不好就“当机”。所以笔者建议各位对于指针只要能看懂就行,当然如果你是准备参加考试的就另当别论了。



学语言还是看经典教材, 就那么几本...看别人的, 很容易被误入歧途...


 boxpei 回复于:2007-02-14 14:09:08

非常精彩的言论,厚厚


 cobras 回复于:2007-02-14 14:23:59

学C语言如果不用指针,就不要学了.
C语言的精华都在指针中.


 思一克 回复于:2007-02-14 14:46:17

文章作者勇气比较大。敢写。

还有写正规的教科书也有类似的问题。作者可能根本不会(或非常不熟练)书的内容,但就是出书了,而且还被许多学校当教材。


 jackk294 回复于:2007-02-14 16:17:53

哦,我好久以前遇到过这样的问题,现在才明白


 VirusCamp 回复于:2007-02-14 17:00:16

&a[j]

只能说明某编译器不能正确给出 &a[j] 的类型或者值


 VirusCamp 回复于:2007-02-14 17:05:00

http://www.yesky.com/20011224/211309_2.shtml
太牛了

引用:虽说很多程序语言都有函数这一内容,但笔者觉得C语言的函数是最有魅力的。如果你能完全掌握C语言的函数,那么学习C++就不成问题了


引用:笔者曾经作过一个比较字符串的实验,用C语言中的strcmp()函数只要一句话,而自己编写的话30句话都摆不平,可想而知函数是多么实用呀!


引用:对于高深莫测的C语言来说,寥寥3千字并不能说清楚的什么问题。但只要您看了此文后,我想对于您学习此语言一定有很大的帮助,同时也能了知晓如何用最短的时间学会C语言以及掌握C语言的精髓所在。另外,此文中所涉及的知识点都是笔者通过实践得出的,因此若是其他专业书籍没有讲到过的问题可以参考本文。最后祝大家学习C语言顺利!


可想而知作者是多么的牛呀!


 isnowran 回复于:2007-02-14 18:06:02

我一见“笔者”二字,马上就联想到某高人唇青脸白晃晃悠悠的从烟雾缭绕的卧室里计算机前的坐卧两用沙发椅子上站起来,何故?

刚刚3天两夜连续奋战把新上市的XX游戏玩通关又风尘仆仆不顾疲劳的赶了半天稿发布在某某网站,不死已是莫大的奇迹...


 Neil 回复于:2007-02-14 21:52:06

。。。。太牛了
没钱过年的时候我也去发几篇稿子写几本书赚赚辛苦钱吧


 iamkey9 回复于:2007-02-14 23:16:10

引用:原帖由 Neil 于 2007-2-14 21:52 发表
。。。。太牛了
没钱过年的时候我也去发几篇稿子写几本书赚赚辛苦钱吧 



免了,别毒害下一代了,我们被毒得还不够啊?不缺那几个吧?


 namei 回复于:2007-02-15 00:13:05

以后打死我也不看这种破烂文章了!


 飞灰橙 回复于:2007-02-15 00:59:06

引用:原帖由 namei 于 2007-2-15 00:13 发表
以后打死我也不看这种破烂文章了! 



不看怎么知道是破烂呢?
楼主经常不include头文件就调用函数么。:m01::m01:


 ivygg 回复于:2007-02-15 00:59:23

估计编译器在复写优化后x值直接存在寄存器中赋给数组元素,x没有后继运算,会删掉写x的多余指令。没有效率差别。


 williamlovecyl 回复于:2007-02-15 11:56:40

引用:原帖由 lenovo 于 2007-2-13 22:45 发表

用TC系统编写小程序时,如果程序里用到浮点输入,有时运行中会出现下面错误信息: 

scanf : floating point formats not linked 
Abnormal program termination 

这个错误信息的意思是:scanf的浮点格式 ... 




然~

:em21:


 995636 回复于:2007-02-15 21:51:20

………………

看来学习cs还是要看原版书籍,最好还是发明xx的人自己的作品。

大学如果采用此人作品,误人子弟甚矣。


 Neil 回复于:2007-02-15 21:56:28

引用:原帖由 iamkey9 于 2007-2-14 23:16 发表


免了,别毒害下一代了,我们被毒得还不够啊?不缺那几个吧? 



@@
:em06:
我。。。我写的稿子不至于这么糟糕吧。。。。。
被打击了


 梦幻孤光 回复于:2007-03-09 21:37:50

scanf("%f",&a[j]);
这里不应该有&这个符号




原文链接:http://bbs.chinaunix.net/viewthread.php?tid=899435
转载请注明作者名及原文出处



收藏本页到: