各位前辈,小生初学C语言,目前自学中,但是在看程序的过程中卡在分号的地方
#include<stdio.h>
int main()
{
int max(int x, int y);
int a,b,c;
scanf("%d,%d",&a,&b);
c=max(a,b);
printf("max=%d\n",c);
return 0;
}
int max(int x, int y)
{
int z;
if(x>y)z=x;
else z=y;
return(z);
}
这是一个比较大小的程序,我搞不懂的地方就在于第四行是对max的声明,这是一个语句。要加分号。但第五行是对a,b,c三个变量的定义,为什么要加分号?
还有在对max函数定义时,又不加分号了,同样都是定义,为什么一个加,一个不加?
请指点
你可以这样理解: 前面你是在定义max函数,是程序里一个句子,所以每执行一个句子后,都要加分号,不然编译器不认识你这个代码句子。
而后面则是对你定义的max函数进行解释撰写,是一个独立的函数类似main{} , 只是这里成了 max{} ,是一个整体,不用分号。
当然如果你把 int max(int a,int b); 写在main{}函数外面的上面, 程序是正确的;
又或者你不写这个int max(int a,int b); 来定义, 直接在main{}函数外面的上面写 int max(int a,int b){} 为后面作出解释, 程序也是对的。
也就是说 定义的时候要分号,解释的时候不要。
分号用于分割语句,不是分割变量
C语言允许在一行中定义多个变量,或者申明一个函数原型。
函数申明由返回值 函数名(参数列表)构成,是个不可分割的整体,所以内部不要分号。
分号的使用是初学者往往容易犯错的地方,要么少了分号,要么多了分号。少了分号多见于定义变量和给变量赋值的时候,而多了分号则多见于分支结构和循环结构中。如程序段1、2、3所示。
//程序段1,在定义变量和赋值时少了分号
1 int a,b
2 a=20;
3 b=30
//程序段2,分支结构中多了分号
1 if(a>b);
2 printf("%d",a);
//程序段3,循环结构中多了分号
1 while(a<50);
2 a++;
3 for(i=1;i<10;i++);
4 b++;
那么,究竟在什么时候该使用分号,什么时候不该使用分号呢?许多资料列举了使用分号的不同情况,但是未能触及本质,也给学习者带来了记忆上的负担,有些书籍则避而不谈,只是通过学习者对示例程序的模仿而形成的“语感”来决定是否使用分号。
其实,只需弄清分号在C语言中的含义,什么时候使用分号的问题就迎刃而解了。在C语言中,分号表示语句的结尾,意即一个分号表示着一句具有完整意义的C语句的完结。而什么是“具有完整意义的C语句”呢?即是意思明确,说完了一件事情,完成了一个操作的C语句。
如程序段1中的“b=30”,表示将30赋值给变量b,意思完整,操作完成,因此需要加上分号。而程序段2本意是想表达如果a大于b,那么打印a,而示例的写法却告诉计算机“if(a>b)”是一个完整意义的C语句了,完成了一个操作了。这在语法上是没有错,而却与程序设计者的初衷相去甚远,此时的含义已经变成了如果a大于b,那么什么都不做(因为分号前没有任何操作)。程序段3也是如此。
循环结构还有一种do-while语句,其结构形式如下所示。
do{
程序段S
}while(表达式P);
这处while后的分号是必不可少的,为何?因为此处已经将完整的意思表达清楚,如果不加分号,那么计算机就会将这部分与此后的代码误认为是同一句语句,造成表意不清的错误。
其实,C语言的语法都有其设计的原理和背景,如果能多了解这些原理和背景,那么语法就不再是需要死记的凭空生出来的规则,而是自然的逻辑演绎的结果。
你只要记住语句结束加分号,函数申明不用加,你看int main()不是也没加吗,多看习惯就好了
分号表示一个语句的结束
在不会产生歧义的情况下,用于表示语句结束的分号是不需要的,比如 {...} 后面
** 分号是语句结束的标志,但循环、if、以及子函数如long long a(int b)后边不要分号,其他都用,但不能加两个分号,虽然不会报错,但可能会影响结果。其实分号挺简单的,它就表示着一个语句的结束, 就像平时我们语文中说完一句话加上个句号, C语言中说完一句话后面加上个分号;
比如 printf("hello,world\n"); 说完一句话加上个分号告诉计算机你说完这句话了。**
不是很容易说明白。最好的办法就是:把不同的代码多敲几次,自己就可以感觉到什么时候用分号,什么时候不用分号。就像小时候不知道怎么用量词,以后慢慢就习惯了。
多谢各位的解答,大体上是理解了,我的再多看看,最后,再次感谢大家