c-当程序与a++b一起打印时,根据词法分析,a++b的输出错误



我编写了以下C程序来查找+++b 的输出

#include<stdio.h>
int main()
{
int a=5, b=2; 
printf("%d",a+++b);
}

我得到的输出是7,根据词法分析,这是正确的。

除此之外,我编写了一个单独的程序来查找+++b 的输出

#include<stdio.h>
int main()
{
int a=5, b=2; 
printf("%d",a++ + b); 
}

对于上面的程序,我再次得到7的输出(根据词法分析,这也是正确的(

但是,当我写了一个程序来打印a+++b和a++++b的输出时,我得到了不同的输出

#include<stdio.h>
int main()
{
int a=5, b=2; 
printf("%d",a+++b); 
printf("n%d",a++ + b); 
}

a+++b的输出为7(正确(,a+++b的输出为8(错误(。

有人能指出第三个程序中的错误吗?

a++是修复后增量。它的计算结果为a,并在调用封闭的printf()之前将变量a递增1(在本例中为*(。

因此,在第一个printf()之后,a的值为6。

那么,您现在对第二个printf有什么期望呢?

像post-fix++这样的运算符是表达式(有值(和指令(有效果(。它们会给新手带来无尽的混乱bug和未定义的行为,并不时地咬最有经验的程序员的屁股。

(*(这些运算符很有用,也有它们的位置,但这些运算符的确切生效时间很复杂,有时会违反直觉,我建议您不要在复杂的表达式中使用它们。当编译器没有为您优化代码,而程序员不得不提供帮助时,它们就有点倒退了!

这里的问题不是第二条语句中的空格,而是您有两个空格。在第一个语句之后(确切地说,在调用a++之后(,a的值递增,现在为6。因此a++ + b将清楚地返回8。如果您省略了第一个printf调用,而只调用第二个,那么您将获得预期的7

最新更新