我知道像下面这样的语句(用逗号代替分号)看起来很奇怪:
if(a < b) printf("Hello\n"), a+=5, b/=5, printf("%d,%d", a, b);
但它工作得很好,我读到这是因为
comma
这里充当序列点。我能理解这一点。但我只是不明白为什么以下会失败,我也使用了 else
:
if(a < b) printf("Hi\n"), else printf("Bye\n"), 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("Hello\n"), a+=5, b/=5, printf("%d,%d", a, b); // Works well
if(a < b) printf("Hi\n"), else printf("Bye\n"), a+=5, b/=5, printf("%d,%d", a, b);
}
逗号运算符需要一个表达式,而
else
if
构造的 else
部分不是表达式。因此,逗号后跟关键字 else
是语法错误。
想象一下:
(a, b)
翻译为:
{
a;
return here b;
}
在这种情况下,
return here
表示“插入此表达式的位置”。事实上,,
充当序列点。
那么,
if (a<b) printf("Hello\n"), a+=5, b/=5, printf("%d,%d",a,b);
看起来像:
if (a<b)
{
printf("Hello\n");
a += 5;
b /= 5;
return here printf("%d, %d", a, b);
}
但是
if(a<b)printf("Hi\n"),else printf("Bye\n"),a+=5,b/=5,printf("%d,%d",a,b);
看起来像:
if (a < b)
{
printf("Hi\n");
else printf("Bye\n");
a += 5;
b /= 5;
return here printf("%d, %d", a, b);
}
而且里面的else没有任何意义。这就是编译器抱怨的原因。
换句话说,C++中的
,
是一个运算符。所以根据运算符优先级,
if(a<b)printf("Hi\n"),else printf("Bye\n"),a+=5,b/=5,printf("%d,%d",a,b);
被解释为
if(a<b) ( printf("Hi\n"),else printf("Bye\n"),a+=5,b/=5,printf("%d,%d",a,b) );
这明显违反了 C++ 语法规则。
在第二种情况下else没有匹配的if,这里发生的事情是在 printf("Hi "),当 else 到达时,编译器会查找 if,即 else 只能在终止 if 语句之后才出现。所以它会给出错误。
查看 if-else 语句的正确语法。编译器需要一个分号来知道 if 结束。因此,您基本上是在尝试在第一个语句中输入子 if-else 语句,但没有新的 if。
if(a >= 18 &a <= 64) printf("adult\n");
else if(a <= 17) printf("minor\n");
else printf("senior\n");
因此,要么大括号“{}”指示 if 区域,要么如果它们缺失,if 语句在第一个分号之前一直有效。