小编cod*_*luv的帖子

为什么编译器不会生成错误"左值"?

根据我的理解,在下面代码标记为"第2行"的行中,表达式(*ptr)++应生成"需要左值"错误,因为*ptr求值为常量值i=1,而不是左值?

那么为什么该计划成功运作?或者我的概念出错了?如果是的话,请赐教.

int main(void)
{
    int i;
    int *ptr = (int *) malloc(5 * sizeof(int));

    for (i=0; i<5; i++)
        *(ptr + i) = i;

    printf("%d ", *ptr++);   //line 1
    printf("%d ", (*ptr)++); //line 2 
    printf("%d ", *ptr);     //line 3
    printf("%d ", *++ptr);   //line 4
    printf("%d ", ++*ptr);   //line 5
}
Run Code Online (Sandbox Code Playgroud)

c pointers lvalue

4
推荐指数
1
解决办法
109
查看次数

序列点和副作用

根据序列点定义,序列点是" 执行序列中称为序列点的指定点,以前的评估的所有副作用都保证完整 "

因此,在下面的程序中,++操作符的所有副作用必须在进入&&操作符的第二部分之前执行,即,i应该像&&序列点一样递增到1 .

#include<stdio.h>

int main()
{
    int i=0,a;
    a=i++&&1;
    printf("%d",a);
    getchar();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

预期产量:

1(1&&1=1)

实际产量:

0

为什么i第二部分之前不增加?

使用三元运算符也可以提供相同的输出:

#include<stdio.h>

int main()
{
    int i=0,a;
    a=(i++)?1:0;

    printf("%d",a);
    getchar();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

三元运算符也是序列点.那么这不应该给出输出1而不是0吗?

c sequence-points post-increment

2
推荐指数
1
解决办法
120
查看次数

增量和逻辑运算符优先级

在下面显示的程序中,应首先评估前缀,因为它具有更高的优先级,但是答案是-2, 2, 0, 1并且在书中解释"因为||的LHS是真的,RHS未被评估".
为什么会这样?应首先执行所有增量,然后由于优先级检查逻辑.

#include<stdio.h>

int main()
{
    int i=-3, j=2, k=0, m;
    m = ++i || ++j && ++k;
    printf("%d, %d, %d, %d\n", i, j, k, m);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c pre-increment

2
推荐指数
1
解决办法
388
查看次数