文章作者:冰血封情[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: ';' : 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
另外由于逗号运算符的优先级低于赋值运算符 所以上面的语句中括号必不可少