为什么语法如" a = b --- //换行,行没有结束;"不会产生语法错误?

时间:2016-12-07 07:02:07

标签: c syntax

这个程序的输出是什么以及如何?

#include<stdio.h>

int main(){
     int a=0,b=10;
     a=b---
     printf("the value of b=%d",b);
     printf("the value of a=%d",a);
     return 0;
}

2 个答案:

答案 0 :(得分:5)

在您的代码中,撰写

 a=b---
 printf("the value of b=%d",b);

相同
a = b---printf("the value of b=%d",b);

这是一个带有 undefined behavior 的表达式,因为尝试在两个子表达式中更改并使用变量b的值两者之间的序列点。因此,代码的输出无法证明其合理性。

没有上述问题,通常,语法类似于

x = (y--) -  (<return value of printf() call>)

这是一种完全有效的语法。

注意:

为什么a = b---<something>被视为a = (b--) - <something> a = b - -- <something>归因于maximal munch规则。

答案 1 :(得分:1)

严格来说,正如其他人所说,因为这是未定义的行为,结果可能是任何事情。虽然它们是正确的,但它并不能解释为什么在这个特定的编译器中得到这个特定的答案。

在实践中,b通常会打印为9或10,具体取决于编译器是先执行先行还是先执行printf。

printf返回打印的字符数。在这种情况下,我认为这是16或17。

所以这就像写a = (b--) - 16; b在递减之前是10,这是一个后递减,所以这是使用的值。