分号是个很不起眼的东西,但在C语言编程里面,它的作用不可忽视,多写与漏写都会造成不可预料的错误,下面就列举一些常见的错误。
1、多谢了分号
if或while语句块内如果只有一条语句,那么可以省略大括号的书写,然而,当他们的条件判断框后面不小心加了一个”;”时,会使本来想要在if或while条件成立时执行的语句替换成了一个空语句,把原来要执行的语句“挤到了”if或while语句块外面,使其不管if或while的条件成立与否,都会执行
int main()
{int a = 0;if (a == 0);printf("a = %d\n", a);printf("a != 0, a = %d\n", a);system("pause");return 0;
}
上面程序的本意是当a = 0时,输出a = 0;当a != 时,输出a != 0,a = n(n是此时a的值)
但因为if的判断框(一对())后面多写了一个“;”,编译器就把”;“这个空语句当做了它后面要执行的语句,使printf(“a = %d\n”, a);无论如何都会执行,改变了程序的初衷。
2、漏写了分号
①当一个自定义的类型在定义时忘了在结尾加上分号,且它的下面跟的是一个没有写返回值的函数时,那么编译器会误把这个自定义的类型当成函数的返回值类型,造成不可预料的错误
struct P
{char c;int i;double d;
}
fun()
{printf("fun()是一个无参无返回值的函数\n");return;
}
上面这段代码,函数fun()在设计时是不给返回值的,然而因为定义结构体类型时忘记在结尾处加分号了,使此结构体类型成了函数fun()的返回值类型。
②少了一个分号使函数的返回值发生改变,并对函数逻辑发生错误。
int a = 0;if (a == 0)returna += 10;a -= 10;a *= 10;a /= 10;
假定上面的代码是一个函数的一部分,那么本意是当a = 0时,函数直接返回调用函数,a != 0 时,函数执行return下面的四条语句,但因为return后面漏写了分号,错误的把a += 10作为返回值,使a = 0时返回10,当a != 0时,函数也只能执行a += 10/下面的三条语句。使函数的逻辑发生了很大的改变。