我编写了以下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
。