Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么';t逗号运算符似乎在a";如果;声明及「;否则";代码中的语句?_C_Comma_Sequence Points_If Statement - Fatal编程技术网

C 为什么';t逗号运算符似乎在a";如果;声明及「;否则";代码中的语句?

C 为什么';t逗号运算符似乎在a";如果;声明及「;否则";代码中的语句?,c,comma,sequence-points,if-statement,C,Comma,Sequence Points,If Statement,我知道下面这样的语句(逗号代替分号)看起来很奇怪: if(a<b)printf("Hello\n"),a+=5,b/=5,printf("%d,%d",a,b); 它在'else'之前给出错误预期表达式 为什么第二条语句会出错?在第一条语句中,我们看到,逗号充当序列点。那么为什么它在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);
它在'else'之前给出错误
预期表达式

为什么第二条语句会出错?在第一条语句中,我们看到,
逗号
充当序列点。那么为什么它在
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); 

}
#包括
内部主(空)
{
INTA=30,b=45;
//如果(a想象一下:

(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("Hi\n"),else printf("Bye\n"),a+=5,b/=5,printf("%d,%d",a,b) );

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

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

if(a>=18&a逗号运算符需要表达式,如果
else
构造的
else
部分不是表达式。因此,逗号后跟关键字
else
是语法错误。

在第二种情况下else没有匹配的如果,这里发生的是在prin之后tf(“Hi\n”),当else到达时,编译器只在if语句终止后才查找if,即else是否应该出现。因此它给出了错误。

忘掉一切Python(或任何其他非C/C++语言)曾经教过你一个逗号,它是C和C++中的一个运算符。在这种情况下,它不仅仅是一个序列点问题。它是一个语言问题。你所陈述的语句的形成违反了C99第64.4条选择语句。@ WoZoCurig请把它放在一个答案中,连同标准的引文。@ R u Popel'的秃鹰。Jens实际上hit比我能/做的更简洁,imho,没错。语法破坏了与if-then-else的一致性,只是因为在else之前没有一个完成的语句,它就因为它的寂寞而悬在那里。我已经投票支持了他的答案。+1尽管看起来很简单,它是对的imho。I的语句结尾f部分永远不会结束,逗号链以else开头,因此无效。回答不错,先生。这可能也很有用:
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);
}
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) );
if(a>=18 &a <=64)printf("adult\n"); 
else if(a<=17)printf("minor\n"); 
else printf("senior\n");