根据我的理解,在下面代码标记为"第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) 根据序列点定义,序列点是" 执行序列中称为序列点的指定点,以前的评估的所有副作用都保证完整 "
因此,在下面的程序中,++操作符的所有副作用必须在进入&&操作符的第二部分之前执行,即,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吗?
在下面显示的程序中,应首先评估前缀,因为它具有更高的优先级,但是答案是-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)