我知道像下面这样的语句(逗号代替分号)看起来很奇怪:
if(a<b)printf("Hellon"),a+=5,b/=5,printf("%d,%d",a,b);
但是它工作得很好,我读到这是因为comma
在这里作为一个序列点。我能理解。但我只是不明白为什么下面失败了,我也使用了else
:
if(a<b)printf("Hin"),else printf("Byen"),a+=5,b/=5,printf("%d,%d",a,b);
给出错误expected expression before 'else'
。
为什么第二个语句出错?在第一个表述中,我们看到comma
作为一个序列点。那么为什么在else
之前没有这样做?第二种导致错误的情况有什么特殊之处?以下是我的完整程序:
#include<stdio.h>
int main(void)
{
int a=30,b=45;
//if(a<b)printf("Hellon"),a+=5,b/=5,printf("%d,%d",a,b); //Works well
if(a<b)printf("Hin"),else printf("Byen"),a+=5,b/=5,printf("%d,%d",a,b);
}
逗号操作符需要一个表达式,而if
else
结构的else
部分不是表达式。因此,逗号后跟关键字else
是语法错误。
想象一下,
(a, b)
被翻译成:
{
a;
return here b;
}
在本例中,return here
表示"插入该表达式的位置"。事实上,,
作为一个序列点。
,
if (a<b) printf("Hellon"), a+=5, b/=5, printf("%d,%d",a,b);
看起来像:
if (a<b)
{
printf("Hellon");
a += 5;
b /= 5;
return here printf("%d, %d", a, b);
}
,
if(a<b)printf("Hin"),else printf("Byen"),a+=5,b/=5,printf("%d,%d",a,b);
看起来像:
if (a < b)
{
printf("Hin");
else printf("Byen");
a += 5;
b /= 5;
return here printf("%d, %d", a, b);
}
里面的else没有任何意义。这就是编译器抱怨的原因。
也就是说,c++中的,
是一个操作符。根据运算符优先级,
if(a<b)printf("Hin"),else printf("Byen"),a+=5,b/=5,printf("%d,%d",a,b);
被解释为
if(a<b) ( printf("Hin"),else printf("Byen"),a+=5,b/=5,printf("%d,%d",a,b) );
这显然违反了c++语法规则
看看IF-ELSE语句的正确语法。编译器期望分号知道IF结束。所以你基本上是尝试在第一个语句中输入子if-else语句,但没有新的if。
if(a>=18 &a <=64)printf("adultn");
else if(a<=17)printf("minorn");
else printf("seniorn");
那么,要么花括号"{}"表示IF区域,要么如果没有,IF语句在第一个分号之前有效
在第二种情况下else没有匹配if,这里发生的事情是在printf("Hin")之后,当else到达编译器时寻找if,即else应该只在终止if语句之后出现。所以它给出了错误