0

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

 if(a<b)printf("Hello\n"),a+=5,b/=5,printf("%d,%d",a,b);

但它工作得很好,我读过这是因为comma这里充当了一个序列点。我可以理解这一点。但我只是不明白为什么以下失败了,我也使用了 a 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); 

}
4

4 回答 4

5

逗号运算符需要一个表达式,而构造的else一部分if else不是表达式。因此,关键字后跟逗号else是语法错误。

于 2013-05-16T08:36:47.933 回答
3

设想:

(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++ 语法规则。

于 2013-05-16T08:28:08.140 回答
0

在第二种情况下else没有匹配的if,这里发生的是在 printf("Hi\n") 之后,当 else 到达时编译器会寻找 if ie else 应该只在终止 if 语句之后出现。所以它给出了错误。

于 2013-05-16T08:59:53.820 回答
0

查看 IF-ELSE 语句的正确语法。编译器希望分号知道 IF 结束。因此,您基本上是在尝试在第一个语句中输入 sub if-else 语句,但没有新的 if。

if(a>=18 &a <=64)printf("adult\n"); 
else if(a<=17)printf("minor\n"); 
else printf("senior\n");

因此,大括号“{}”表示 IF 区域,或者如果缺少它们,则 IF 语句在第一个分号之前有效。

于 2013-05-16T08:34:16.580 回答