发新话题
打印

[原创]C语言蛛丝计划 学习中我所看见的细节总结(第一部分)

[原创]C语言蛛丝计划 学习中我所看见的细节总结(第一部分)

文章作者:冰血封情[E.S.T]
信息来源:邪恶八进制 中国(www.EvilOctal.com

最近受到刺激 所以从头重新再学C语言 说复习也可以 说重学也好 反正都是那么回事 不用罗罗嗦嗦的
leave me alone!
这里和上面的TIPS我会一点点加新内容的 上面的TIPS是跟帖添加 我这里会以编辑帖的方式加东西的...

都是一些学习过程中的细节 不要罗B嗦嗦少废话 开始...

001行末少分号报错在下一行
复制内容到剪贴板
代码:
# include "stdio.h"

int main(void)
{
     printf("Hello, world!\n")
     return 0;
}
上面的程序有明显的错误 大家都可以看出来 少了一个; 但是编译报错的时候 以VC++6.0为准 其报错内容如下
E:\MyPrograms\VC\Project\Cpp1.cpp(6) : error C2143: syntax error : missing ';' before 'return'
Error executing cl.exe.
明明分号少在第5行 为什么报错在第6行呢?问题的答案在于:
C编译器并不关心行之间的换行符 printf()语句之后的分号也可以放在下一行的开头 虽然这不是个好习惯 但没错
因此 编译器遇到第6行的下一个命令后 才能确定是遗漏了一个分号 所以就报错在第6行了

002stdprn的一些小资料
复制内容到剪贴板
代码:
#include "stdlib.h"
#include "stdio.h"

// 前置声明
void do_heading(char *filename);

// 全局变量
int line=0, page=0;

int main(int argv, char *argc[])
{
     char buffer[256];
     FILE *fp;

     // 如果没有命令行参数,则在控制台上输入
     if(argv<2)
     {
          fprintf(stderr, "\nProper Usage is:");
          fprintf(stderr, "\n\nprint_it filename.ext\n");
          return(1);
     }

// 打开文件出错
if((fp=fopen(argc[1],"r")) == NULL)
{
     // 在标准错误台上输出信息
     fprintf(stderr, "Error opening file, %s!", argc[1]);
     // 结束程序
     return(1);
}

page=0;
line=1;
do_heading(argc[1]);

// 读出256个字符
while(fgets(buffer,256, fp)!=NULL)
{
     // 正好是55个字符的话
     if(line%55 == 0)
          do_heading(argc[1]);
}

     fprintf(stdprn, "\f");
     fclose(fp);
     return 0;
}

void do_heading(char *filename)
{
     // 页数加1
     page++;

          // 如果页数大于1,输出一个控制符
          if(page>1)
              fprintf(stdprn, "\f");

          // 输出一些信息
          fprintf(stdprn, "page: %d, %s\n\n",page, filename);
}
上面的程序在VC++6下调试是会报错的 为什么呢?因为stdprn不是ANSI定义的值
避开的方法是用stdout替换stdprn

003说说C语言中的空白
大家都知道 C语言是忽略空白的 什么是空白呢
源代码中的空格 水平制表符 垂直制表符和空行 都是空白 当编译器读取源代码的语句时 查找语句中的字符和末尾的分号 但是忽略空白 因此
x=2+3;和x = 2 + 3;是等价的 甚至和下面的语句等效
x      =
2
   +
3  ;
这就是001中说的 为什么报错在下一行的道理了 因为直到到下一个语句的开始 还没发现;才能确定是少了
但是 这里我要总结的是 C语言中忽略空白里有一种例外的现象 字面字符串常量中的制表符和空白不被忽略 他们被视为字符串的组成部分
"Fuck you stupid gliet teacher"和"Fuck you   stupid gliet teacher"是不同的
还有更有意思的 下面的格式不太好
复制内容到剪贴板
代码:
printf(
"Fuck you!stupid gliet teacher."
);
但是是合法的 但是下面的就不合法了
复制内容到剪贴板
代码:
printf(
"Fuck you!
stupid gliet teacher."
);
前面说过了 我们如果想要把字面字符放在多行中 必须这样
复制内容到剪贴板
代码:
printf(
"Fuck you!\
stupid gliet teacher."
);
004if语句表达式后面的分号
我靠 是人都知道 if语句表达式后面不能有分号 这是错误di 这里追求的是原因
if语句应该以条件语句结束 如果象下面这样 你加了分号
if( x == 2 );
statement1;
由于分号出现 那么if( x == 2 );将被视成一条语句
而statement1;也铁定会被执行了 对于这种错误 书上说编译器通常不会报错 我自己的测试也是没报错
但是有警告
引用:
warning C4390: &#39;;&#39; : empty controlled statement found; is this the intent?
以后我可得注意不能犯错误 semicolon does not belong

005有关if_else结构和条件运算符
大家也许注意到了 条件运算符的功能有些类似if语句
复制内容到剪贴板
代码:
if (X > y)
z = x;
else
z = y;
可以简便写成
复制内容到剪贴板
代码:
z = (X > y) ? x : y;
并非所有的能够使用if...else结构的情况都能使用条件运算符 这个应该很容易明白的 因为if...else可以表达比条件运算符更复杂的东西
但是 条件运算符也用于不能使用if语句的地方 比如调用另外一个函数
复制内容到剪贴板
代码:
printf("There r %d fucking gliet teachers in the school.",((x > y) ? x : y));
006某些情况下的逗号运算符
C语言中 逗号通常只作为一个简单的标点 用于分开变量声明 和函数参数等
但是 在某些情况下 逗号也将是运算符 而不是分隔符 我们可以用逗号把两个子表达式组成一个表达式
两个表达式都会被计算 而且先计算左边的表达式
整个表达式的结果为右边的表达式的值
比如
复制内容到剪贴板
代码:
x = (a++ , b++);
上面的语句是 把b的值先赋给x 然后把a和b都加1
另外由于逗号运算符的优先级低于赋值运算符 所以上面的语句中括号必不可少

TOP

其实.......冰血..........我觉得学习一种语言不能太过于在乎语法上的或者说一些细节上的问题,实践最重要......在熟练地掌握语言后回过头来关注一些具体点的理论上的问题效果更好。
BLOG: http://blog.csdn.net/hkbyest

TOP

引用:
下面是引用evilbogy于2005-02-07 20:09发表的:
其实.......冰血..........我觉得学习一种语言不能太过于在乎语法上的或者说一些细节上的问题,实践最重要......在熟练地掌握语言后回过头来关注一些具体点的理论上的问题效果更好。
收到...
但是我在学习过程中遇见的问题是一定要总结的 已经在实践了 多谢提醒

TOP

其实.....我现在也是在回头学习C中......共同共同.....
BLOG: http://blog.csdn.net/hkbyest

TOP

写习惯了就好了。指不准哪天在纸上写东西的时候你也不自觉地写上分号,那你就惨了。
对待处女,谁污染,谁治理。 对待内存,谁分配,谁释放。

TOP

引用:
下面是引用无锋之刃于2005-02-08 01:50发表的:
写习惯了就好了。指不准哪天在纸上写东西的时候你也不自觉地写上分号,那你就惨了。
这本老外的书上有一个警告 十分搞笑
引用:
请切记,一天写过多的程序会得C语言病。
曾几何时,有人对我说:装B遭雷劈。我说:去你妈的。于是,这个人又对我说:如果再说脏话,上帝会惩罚你的。我说:我操上帝。结论:彪悍的人生不需要上帝。

TOP

引用:
下面是引用dahubaobao于2005-02-08 02:30发表的:
C有什么病?  分号病?
楼上的就是20年前人称恶极邪童的超级色孩逢人吻吧?
写多了C就会变色的...
曾几何时,有人对我说:装B遭雷劈。我说:去你妈的。于是,这个人又对我说:如果再说脏话,上帝会惩罚你的。我说:我操上帝。结论:彪悍的人生不需要上帝。

TOP

一些细节的东西还是注意一点好,不过如果老是在细节的地方打转就不好了。在宏观上把握程序的流程也是学习的好方法。
安全就象毒品一样,上瘾了就戒不掉了 http://www.6code.net

TOP

引用:
下面是引用evilbogy于2005-02-07 20:09发表的:
其实.......冰血..........我觉得学习一种语言不能太过于在乎语法上的或者说一些细节上的问题,实践最重要......在熟练地掌握语言后回过头来关注一些具体点的理论上的问题效果更好。
不同意,很多不良的习惯会给后期的debug带来巨大的困然。

比如说声明的同时赋初值,比如float 不能用==等等
寻找辣辣!!!

TOP

回楼上的,你说的很对,但是在你熟练掌握语言的过程中很多问题都会出现并被解决。

一句话,多写。

不良的习惯嘛.....如果是指书写风格等那还是要注意注意的。
BLOG: http://blog.csdn.net/hkbyest

TOP

发新话题