c语言 - 为什么逗号运算符似乎在我的代码中的 "if" 语句和 "else" 语句之间不起作用?



我知道像下面这样的语句(逗号代替分号)看起来很奇怪:

 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语句之后出现。所以它给出了错误

相关内容

  • 没有找到相关文章