C语言关于if语句的问题。

看看下面这条程序
#include<stdio.h>
#include<math.h>
void main()
{
float a,b,c,x1,x2,S,Q,X;
printf("Please input the number of 'a','b'and'c':\n");
scanf("a=%f,b=%f,c=%f",&a,&b,&c);
if(fabs(a)<=1e-8)
printf("is not a quadratic\n");
else
{
S=b*b-4*a*c;
if(fabs(S)<=1e-8)
printf("has two equal roots:%8.4f\n",-b/(2*a));
else
if(S>1e-8)
{
x1=(-b+sqrt(b*b-4*a*c))/(2*a);
x2=(-b-sqrt(b*b-4*a*c))/(2*a);
printf("has distinct real roots:%8.4f and %8.4f\n",x1,x2);
}
else
{
Q=-b/(2*a),X=sqrt(-(b*b-4*a*c))/(2*a);
printf("has conplex roots:\n");
printf("%8.4f+%8.4fi\n",Q,X);
printf("%8.4f-%8.4fi\n",Q,X);
}
}
}

再看看下面这条程序
#include<stdio.h>
#include<math.h>
void main()
{
float a,b,c,x1,x2,S,Q,X;
printf("Please input the number of 'a','b'and'c':\n");
scanf("a=%f,b=%f,c=%f",&a,&b,&c);
if(fabs(a)<=1e-8)
printf("is not a quadratic\n");
else
S=b*b-4*a*c;
if(fabs(S)<=1e-8)
printf("has two equal roots:%8.4f\n",-b/(2*a));
else
if(S>1e-8)
x1=(-b+sqrt(b*b-4*a*c))/(2*a);
x2=(-b-sqrt(b*b-4*a*c))/(2*a);
printf("has distinct real roots:%8.4f and %8.4f\n",x1,x2);
else
Q=-b/(2*a),X=sqrt(-(b*b-4*a*c))/(2*a);
printf("has conplex roots:\n");
printf("%8.4f+%8.4fi\n",Q,X);
printf("%8.4f-%8.4fi\n",Q,X);
}

两条程序的区别就是有没有加花括号,第一条程序是正确的,可是为什么第二条程序点编译的时候总是提示“c.c(20) : error C2181: illegal else without matching if”,为什么最后一个else没有if跟他配对,看不懂,各位能解释一下吗

if(表达式) 语句;当不是一条语句时一定要加上大括号的。你得第二个程序中 if(S>1e-8)本应该执行它下面的三条语句,else执行下面的四条语句。可是由于你没有加大括号使得 if(S>1e-8)只执行了一条语句 x1=(-b+sqrt(b*b-4*a*c))/(2*a);而后面的两条语句顺序执行,原来的if-else语句变成了if语句,因此下面的else就没有了配对的if。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-03-26
花括号只能在语句块只有一句话时省略,if和else总是只匹配他的后一句,当有多句时就需要用花括号让编译器把花括号中的语句块当做一句话处理。你这里最后一个else前有三句话,而if只匹配第一句,按逻辑重新缩进后,最后一个else就掉到所有语句体外面,函数体内部的尴尬位置了。
第2个回答  2013-03-26
第二个程序程序正是由于少了{ }引起else与if不匹配,else和if都只能管到它们后面的第一条语句,也就是说它们后面的第二条语句就与它们无关了,所以当要在满足if或else的条件时执行多条语句,必须用到{ },否则编译通不过的。
第3个回答  2013-03-26
if 和else之间只能有一条语句或一个块,块就是由花括号括起来的一段代码
第4个回答  2013-03-26
因为最后一个if是前一个else中的句子和最后一个else没关

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网