1)首先第一个问题
if(表达式)
{
语句;
}
else if(表达式)
{
语句;
}
如果if条件为真。。
并且执行了该语句。。
那么还会不会继续向下判断else if()语句并执行它??
答案是,不会再继续向下判断了。
2)第二个问题
你的这个程序,计算的是,字符数,行数和单词数。
字符数 n1
很显然,每读一个字符,就递增一个。
行数 n2
是每遇到一次回车符号 \n,就递增一个。
这个在程序里都很明显可以看出来。
对于单词计数,它的判断原则是,如果不是,
空格 ' ' 或者回车符号 '\n'或者TAB符号'\t'之一
并且现在还没在单词状态的话,就认为是一个新单词的开始位置的字符。
就将单词计数器 n3 递增一个。并认为进入了单词状态。
if(c == ' ' || c == '\n' || c == '\t')
{
}
else if(state == out) //如果现在还没在单词状态
{
++n3; //单词计数器递增
state=in; //进入单词状态
}
反之,如果是
空格 ' ' 或者回车符号 '\n'或者TAB符号'\t'之一
就认为离开了单词状态。
if(c == ' ' || c == '\n' || c == '\t')
{
state=out; //离开单词状态。
}
else if(state == out)
{
}
不知道这么解释是不是能看懂。有问题可以发信息给我。
问题一:
else if不会被执行
解释:只有当else前面的条件为"假"时,才会执行else后面的语句或条件;若else前的条件为"真",则else不会被执行.
问题二:
state表示状态,state=in表示在单词里面,state=out表示在单词外面
语句执行时利用state在in和out间交替判断某个单词的开始和结尾,也就是用state标识出单词的界限。
当state=out时,单词数加1,state变为in(此种状态单词数不累加);当state又一次变为out时,单词数又开始累加。
//....
//下面for循环里的if。。。else的语句多于一句,需要用{}
for(i=0;i<20;i++)
{
scanf("%f",&s);
if(s>=90&&s<=100){
printf("优秀%d");
n1++;
}
else
if(s>=80&&s<=89)
{printf("良好%d");n2++;}
else
if(s>=70&&s<=79)
{printf("中等%d");n3++;}
else
if(s>=60&&s<=69)
{printf("合格%d");n4++;}
else
{printf("不合格%d");n5++;}
}
//....
else if语句是按照表达式的顺序进行判断的,最早值为真的表达式将引起执行相应的语句i,并且不再继续判断其他条件~执行完i后就直接跳转到下一条语句执行了~
if(c == ' ' || c == '\n' || c == '\t')
{
state=out;
}
else if(state == out)
{
++n3;
state=in;
} 这段中 如果c等于空格或者回车(c == ' ' || c == '\n' || c == '\t')就执行state=out; 并且执行完state=out;后就不判断else if(state == out) 了 然后继续向下执行;
如果是多个else if 哪个的判断条件先为真就执行那个 下面的else if就不执行了
如果if执行了不会去判断else if 了。
代码if(c == ' ' || c == '\n' || c == '\t')
是判断是不是到一个单词的末尾了。c == ' ',是C为空格,c == '\n' 是为回车,c == '\t'是为tab,它们都可是一个单词和另一个单词分隔的标志。如果是,说明到单词的结尾了,就将state置为out,接着下一次循环开始。再到这里的时候c就为下一个单词的首字母了,就不会执行if,而进入else if的判断,此时state值为out,所以就执行else if了