我下面所写的都是用“.c”后缀的。“.c”后缀是c源文件的后缀,“.cpp”后缀是c++源文件的后缀。c++继承了
c语言的一些特性,所以有些bug在“.cpp”里是可以通过的。
1、scanf()你真的了解了么?;
scanf()是有返回值的,返回值类型是int,这个你知道么?它返回了成功读入输入信息的个数。
那么我们可以利用它来做什么呢?
非零即真,这句话你一定听说过,而且不止一次。那么我们看一下下面的代码。
int a;
while (scanf("%d", &a) == 0)
{
printf("请输入合法字符:");
}
这样写代码是不是好一点,再输入的同时判断了输入的是否正确。但这会使你进入一个死循环。为什么会这样呢?
我们在输入时,我们的键值需要一块缓冲区在存放键值,如果输入的键值不被scanf()接受,那么它会一直在缓冲区中,那么再仔细看一看上面的代码,你是不是明白了呢。
解决这个问题并不难,只要将输入的键值接受,他就不会在缓冲区中影响你的程序了。看看下面的代码,有没有豁然开朗,哇,scanf()还可以这么使用!
int a;
while (scanf("%d", &a) == 0)
{
getchar();
printf("请输入合法字符:");
}
2、你还在纠结while(),for();
初学者可能会纠结什么场合用while(),什么场合用for()。
在我看来,这根本不存不值得我去纠结,我们应该想的是使用哪个可以使程序更简单,别人更容易看懂。
while(),for()的本质都是循环,只是形式不一样而已。
int i = 0; int i;
while (i<10) for (i=0; i<10; i++)
{ {
i++;
} }
上面的代码当然是for()更简明一写,但1、中的例子却是使用while()。for()比while()在语句要多一些,这是你需要的么?
根据每个人的代码风格不同,不能统一要求使用for()或者while()。建议初学者可以两个都试一下,感觉他们之间的不同,写出漂亮的代码。
3、switch()你会使用么?
switch(n)
{
case 1:
break;
case 2:
break;
default:
}
你一直这么使用么?
我们都知道case 后面不加break,会一直执行下面的代码,直到代码全不执行完或者遇到break。
利用这个特性,我们是不是可以做一些其他的事,比如加法,一年有十二个月,我想算出4月6号是今年的第几天,你想到怎么使用了么?我们看一下下面的代码。
switch (month-1)
{
case 11: sumMonth += 30;
case 10: sumMonth += 31;
case 9: sumMonth += 30;
case 8: sumMonth += 31;
case 7: sumMonth += 31;
case 6: sumMonth += 30;
case 5: sumMonth += 31;
case 4: sumMonth += 30;
case 3: sumMonth += 31;
case 2:
if ((i%4==0 && i%100!=0) || i%400==0)
{
sumMonth += 29;
}
else
{
sumMonth += 28;
}
case 1: sumMonth += 31;
}
你看懂了么?只是提供一个思路,将我们思维打开,你会看见另一片天空。
你在case中定义过变量么?
case中为什么不能定义变量呢?
int a;
switch (a)
{
case 1:
int b;
break;
case 2:
b = 0;
break;
}
你这么任性,编译器怎么办!
那我们为什么不规定case 1定义的变量只能在case 1中使用呢?在6、变量作用域中你将会找到答案。
当然,我们不应该只局限于switch(),if() else也一样可以完成多重选择的任务,不过switch()内置3-999个标签,使用switch()的程序运行速度可能稍快一些,代码也更简洁。
4、if()的使用
我们都知道if()用于判断。那么当你判断两个字符相等时,你会怎么写?
int a;
if (a == 5)
如果是我,我会写成
int a;
if (5 == a)
功能是一样的,何必这么麻烦?我们在做一个项目时,不可能十行代码调试半个小时,当我们思维在键盘上飞舞时,我才体会到一个程序员的快乐。在我们正在体验这种快乐时,手误在所难免,如果写成if(a=5),这个错误够你找两天的。但是if(5=a),编译器就可以帮你找到。
当你想判断两个字符串是否相等时,你会不会这样写?
char c_c1[10] = "acdefg";
char c_c2[10] = "qwerty";
if (c_c1 == c_c2)或者if (c_c1[10] == c_c2[10])
总之都是不对的。字符串,数组,指针后面还会有所涉及,这里不做详谈。
比较两个字符串我们用到了C函数库中提供的strcmp()函数,它包含在头文件中。strcmp()返回了一个int类型的值,-1,0,1。0代表两个字符串相等,-1,1是由于字符之间的比较(ASCII)决定的。下面我看一个例子。
char c_ch[10] = "qwertyui" //最多可以存放9个字符,最后一位是”\0“
char *p_ch = "adfgf"
strcmp(c_ch, p_ch); //strcmp()中的两个参数是两个字符串的地址
strcmp("qwertyui", "adfgf"); //这样也是可以的,字符串存放的也是首字母的地址,后面会提到。
5、你知道头文件的作用么?
我们写代码都习惯把#include 最先写上,但你知道它的作用么?
#include :文件包含
当预处理器发现#include 指令后,就会寻找 <>中的文件名并把这个文件包含到你写的程序代码,替换源文件(就是你写的文件)中的#include。虽然你只写了一行代码,但是编译器却