鱼C论坛

 找回密码
 立即注册
查看: 1574|回复: 2

[技术交流] 分享

[复制链接]
发表于 2014-8-19 22:24:04 | 显示全部楼层 |阅读模式
1鱼币
哪个人和我分享下C的经验啊?

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-8-22 11:10:49 | 显示全部楼层
本帖最后由 你好啊 于 2014-8-22 11:13 编辑

0.最好永远别再使用VC++6.0编译环境
        首先VC6是一个C++的IDE,而不是C的——它是用来编译C++程序的,而第一版C++标准在98年才推出,也就是说VC6推出的时候,C++的第一个标准都还没成型——于是VC里有很多非主流的,非标准的数据类型,最好不要对这些数据类型产生印象——比如什么__int64
        另外,虽说C++编译器一般都能编译C语言文件……但VC6出现的时间实在太巧妙了……C语言的第二版标准(C99)诞生在99年……于是VC6就很蛋碎地既不支持现在的C++标准,也不支持比较新的C标准(不对……它连第一版C标准ANSI-C都不太支持!)……如果你非要用VC6……那么除了它“比较经典”外没有任何好处……落后的编译质量……落后的标准……落后的UI……用它干嘛!(还不如弄个turbo c体会一下传统的(legacy)C语言和IDE)
        -->那我用什么来写C? dev-cpp  codeblocks  notepad++加mingw  这3个用的编译器是mingw,GNU的编译器(可以理解为linux下的编译器的移植版);如果你想用微软的,起码也装visual studio 2005以后的版本——只有他们才支持ANSI-C,并且创建一个空工程后自行加入一个.c文件,而不要用生成的cpp——除非你想连C++一起学了(google How to write ANSI C programs by using Visual C++.NET or )。mingw是完全免费的且比较轻量(几十m),相比商业性质的vs(动辄3到5G)精简得多,只是两家编译器对代码的编译实现不太相同,如果你想重现书上i+++i这种蛋疼代码的结果……mingw(gcc)大概得不到相同结果。


1.永远不要写void main()
        说白了void main()是一种非主流的写法——标准里从来没有,也没有哪个编译器明确声明了支持这种写法。标准的C(C99)规定的main只有两种;  int main(void)   int main(int * argc,char * argv)
        这篇文章(http://hi.baidu.com/fmdnniwgubdeuzr/item/d19a05338f108548023edc70)详细解答了为什么不要写void main,文中给出了一个背景资料的链接,是英文的,翻译一下:
        为什么不要写void main?
        -->因为标准说不行
        -->因为程序的引导过程在调用main时(就是用来调用main的那些代码,对我们来说不可见)会假定main把返回值压入堆栈,如果main函数没有这么做,可能会破坏堆栈平衡(看不懂的只需要理解“main该做的没做会导致程序崩溃”就好了)
        -->因为你的程序很可能会返回给你的运行环境一个随机值,如果别人想查看你的程序调用成功没有,或者在makefile(这个程序是用来build工程的,其中会调用一系列程序检查build环境,获取系统信息等等,Linux下比较常用)里调用你的程序就没法通过返回值得知你的程序到底运行后是什么状态。(windows和linux默认都用0代表程序执行成功,这就是为什么其他书上最后都是return 0的原因)


2.永远不要在代码里写i+++i i+++++i a<4&&b>3||c<5这种表达式
        你的程序里永远用不到,就算有,你也会想用括号把他们分开  比如 (a<4&&b>3) || c<5  i+(++i),你想炫耀一下你算符优先级记得很牢? 不好意思……编译器不太懂你的优先级,GCC跟m$的C编译器实现结果就不一样。请老老实实用括号。


3.永远不要用goto进行循环——只用它来跳出多层循环
int i,j;
L1:
j=1;
if(i>10)
  goto out;
L2:
printf("Row %d ; Column %d\n",i++,j++);
if(j<10)
  goto L2;
goto L1;
:out
puts("oooooooooh! i've finally got out!fxxk!i myself know nothing about if it is right or not!");
↑这货在干什么? 其实等价于下面……
int i,j;
for(i=1;i<10;i++)
  for(j=1;j<10;j++)
    printf("Row %d ; Column %d\n",i,j");
puts("oooooooooh! naive!too yong too simple!");
自己看着办……


4.永远使用容易记忆的标识符名——变量,数组,指针,goto标签,whatever
        参见“匈牙利命名法”
int a,b,c,d,e,f,g,h,i,j;
xxx
xxx
xxx
int nInputNum,nInputV1,nInputV2,i,j;
xxx
xxx
xxx
可读性差异一目了然。


5.当只想实现一个重复n次的循环时,特别是想遍历n个元素时(数组/链表/其它数据结构whatever),永远只用for(i=0;i<n;i++)或者while(n--)的形式
        C语言的下标是从0开始的,数组的第一个元素是Array[0],如果你的for循环,i是从0到(元素个数-1),循环同样能执行(元素个数)个,同时i的值刚好跟数组下标对应,这样不会越界。用while(n--)则是防止n变为负数(或者有时候溢出成很大的正数)带来不必要的麻烦,while(n--)循环之后n就是0,逻辑上也比较容易接受。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-8-6 10:20:26 | 显示全部楼层
看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-26 05:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表