今天呢,想和大家一起去看一下我们在写代码的时候常见的一些错误。
1.=不同于==
我们知道=是赋值操作符,而==是一种比较的操作符,我们在写代码的时候容易将比较的操作符误写成赋值的操作符,例如:
#include<stdio.h>
int main()
{
int a=3;
int b=4;
if(a=b)
{
printf("helloword");
}
return 0;
}
这道题其实我们知道if语句中我们其实想比较的是a==b,在这个题中显然a!=b,并不打印helloword,当误写成a=b时,a的值为4,条件成立,打印helloword。
大家再来看一个例子:
#include<stdio.h>
int main()
{
int c=0;
while(c=' '||c==' \t'||c=='\n')
{
printf("强'');
}
return 0;
}
我们知道||操作符的优先级要高于=,而‘ ’的ASCII码值为32,c的值恒为1,所以一直循环打印
2.字符号的判断
我们大家知道/,*,和=,只有一个字符长,称为单字符符号,而像/*和= =等像这种多个字符,称为多字符符号,当编译器读入一个字符再读一个字符后编译器会进行判断,将其作为两个分别的符号判断,还是合起来作为一个符号判断,然后继续读入下一个字符,再对这三个字符进行判断,直到读入的字符串不再可能组成一个有意义的符号,另外符号的中间不能嵌有空白。例如:
a+++b,我们知道当读入两个++时,就不能再读入下一个+了,因为+++并没有意义,而++有意义,会把++合起来看成一个字符。
等价于 a++ +b
而不能写成 a+ ++b
再入
y=x/*p;
这句的本意是将x除*p后的值赋给x,然而
我们知道/*是一段注释开始的标志,因此最终的结果是y=x,直接把x赋值给了y,
因此正确写法应该是y=x/(*p);
3.字符与字符串
用单引号引起的字符实际上代表一个整数,而用双引号引起的字符串,代表的确实一个指向无名数组起始字符的指针,该数组被双引号之间的字符和0初始化。
#include<stdio.h>
int main()
{
printf("hello\n");
char arr[]={'h','e','l','l','o','\n',0};
printf(arr);
return 0;
}
}
我们看到最终打印的结果一样。
4.注意作为语句结束标志的分号
我们一起来看一段代码:
#include<stdio.h>
int main()
{
int a=3;
int b=4;
if(a>b);
printf("helloword");
return 0;
}
我们来看一下程序的运行结果
如果if语句后面没加;我们可以知道a>b为假,不打印helloword,但是一旦加上了,if语句会单独成为一条语句,对printf函数也就不起作用了,所以最终会打印出helloword.
5.函数调用
c语言规定,在函数调用时即使函数不带参数,也应该包括参数列表。因此,如果a是一个函数的话,那么a();是一个函数调用语句,而a;是一个什么也不做的语句。
6.字符串
char*p="abcd",
在这里p存放的是abcd吗?答案当然不是,p其实指向的是一个包含abcd和\0,5个字符的数组的首元素的指针,char arr[5]={'a','b','c','d','\0'}; p=arr p=&arr[0],p[i],是数据中某个元素,我们不妨尝试打印一下。
在这里如果再加上q=p; 这条语句对q[i]进行打印,打印出来的结果如何呢?q所指向的内存存储的字符串‘xYz’,因为p和q所指向的是同一块内存,所以p指向的内存中存储的也是'xYz',所以最终打印出来的结果是一样的。