#include <stdio.h>
int main()
{
int a,b;
b=10;
a=b--;
printf("a=%d b=%d\n",a,b);
a=b--- //Here why i didn't get error....???
printf("a=%d b=%d\n",a,b);
//a=b---- or a=b---; //for these, i got error
a=b--;
printf("a=%d b=%d\n",a,b);
}
为什么声明b---
不会显示错误。我可以说这是一个错误......?如果不是,请解释内部发生的事情......?
答案 0 :(得分:7)
printf
返回int
,因此您有一个语法上有效的语句 * 。此
a=b---
printf("a=%d b=%d\n",a,b);
是单个语句,与完全相同
:a = b-- - printf("a=%d b=%d\n",a,b);
或者,为了更加清晰,
a = (b--) - printf("a=%d b=%d\n", a, b);
换句话说,对于ints
x
和y
,x--- y
被解析为(x--) - y
。
*虽然语法上有效,但语句本身是未定义的行为,因为有一个修改和b
的读取没有插入序列点
答案 1 :(得分:3)
功能printf
的返回类型为int
。
来自C标准
3 printf函数返回传输的字符数,或 如果发生输出或编码错误,则为负值。
所以这句话
a=b--- //Here why i didn't get error....???
printf("a=%d b=%d\n",a,b);
是有效的C语句。它可以作为描述性原因重写为
a = b-- - printf("a=%d b=%d\n",a,b);
或
int tmp = printf("a=%d b=%d\n",a,b);
a = b-- - tmp;
考虑到原始语句具有未定义的行为,因为当表达式b--的副作用将应用于b时未指定。但无论如何都会编译代码。
答案 2 :(得分:2)
a=b--- //Here why i didn't get error....???
printf("a=%d b=%d\n",a,b);
这是一个单一的声明,因为它是以分号终止的,所以是有效的。
Printf返回整数,所以整数 - 整数是有效的opertion
//a=b---- or a=b---; //for these, i got error
这里,上面的staments在语法上是不正确的,因为你只使用一个操作数进行二元运算符减法,这实际上是无效的。
所以,它抛出了错误。希望这有点澄清。