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

问题描述 投票:0回答:4

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

 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);
}
c if-statement comma-operator sequence-points
4个回答
6
投票

逗号运算符需要一个表达式,而

else
if
构造的
else
部分不是表达式。因此,逗号后跟关键字
else
是语法错误。


4
投票

想象一下:

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


0
投票

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


0
投票

查看 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 语句在第一个分号之前一直有效。

© www.soinside.com 2019 - 2024. All rights reserved.