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++;}elseif(s>=80&&s<=89){printf("良好%d");n2++;}elseif(s>=70&&s<=79){printf("中等%d");n3++;}elseif(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了