没有分号的语句没有错误

时间:2014-10-27 07:51:01

标签: c statements

     #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---不会显示错误。我可以说这是一个错误......?如果不是,请解释内部发生的事情......?

3 个答案:

答案 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 xyx--- 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在语法上是不正确的,因为你只使用一个操作数进行二元运算符减法,这实际上是无效的。

所以,它抛出了错误。希望这有点澄清。