为什么 ++ 运算符不在 = 运算符之前
Why is ++ operator not preceding = operator
为什么在这个例子中
*p++ = c;
是*p先等于c然后p加1。我查看了运算符优先级的 this table,它说“=”运算符在 15.place 中,++(后缀)在第一位。这对我来说没有意义。我试过这个的例子:
char in_line[LINELNG];
char *cp;
int c;
cp = &in_line[0];
while((c = getc(stdin)) != EOF){
if(cp == &in_line[LINELNG-1] || c == '\n'){
/*
* Insert end-of-line marker
*/
*cp = 0;
if(strcmp(in_line, "stop") == 0 )
exit(EXIT_SUCCESS);
else
printf("line was %d characters long\n",
(int)(cp-in_line));
cp = in_line;
}
else
*++cp = c;
}
伪代码扩展:
*p++ = c;
相当于
*p = c;
p = p + 1;
而
*++p = c;
相当于
p = p + 1;
*p = c;
++
确实比 C 语言中的大多数其他运算符绑定得更紧密,但它的 pre-/post-fix 位置决定了 p
中的值发生了什么以及何时使用它。
++
和 --
的前缀和后缀形式同时具有 结果 和 副作用 .对于++x
,表达式的结果是x+1
,副作用是x
增加 1。对于 x++
,表达式的 result 是 x
的当前值,而 side effect 是 x
增加 1。
表达式
*p++ = c
被解析为
(*(p++)) = (c)
和评估好像写成1
t = p
*t = c
p = p + 1
需要注意的是,*t = c
和 p = p + 1
可以以任何顺序相互发生,并且 p
仅计算一次。
同样,
*++p = c
被解析为
(*(++p)) = c
并评估为好像写成
t = p + 1
*t = c
p = p + 1
注意事项同上。
- 这是评估的逻辑描述,不一定是编译器生成的代码。编译器可能会安排一些事情,这样它就不会使用临时文件来存储“p”的当前值。
为什么在这个例子中
*p++ = c;
是*p先等于c然后p加1。我查看了运算符优先级的 this table,它说“=”运算符在 15.place 中,++(后缀)在第一位。这对我来说没有意义。我试过这个的例子:
char in_line[LINELNG];
char *cp;
int c;
cp = &in_line[0];
while((c = getc(stdin)) != EOF){
if(cp == &in_line[LINELNG-1] || c == '\n'){
/*
* Insert end-of-line marker
*/
*cp = 0;
if(strcmp(in_line, "stop") == 0 )
exit(EXIT_SUCCESS);
else
printf("line was %d characters long\n",
(int)(cp-in_line));
cp = in_line;
}
else
*++cp = c;
}
伪代码扩展:
*p++ = c;
相当于
*p = c;
p = p + 1;
而
*++p = c;
相当于
p = p + 1;
*p = c;
++
确实比 C 语言中的大多数其他运算符绑定得更紧密,但它的 pre-/post-fix 位置决定了 p
中的值发生了什么以及何时使用它。
++
和 --
的前缀和后缀形式同时具有 结果 和 副作用 .对于++x
,表达式的结果是x+1
,副作用是x
增加 1。对于 x++
,表达式的 result 是 x
的当前值,而 side effect 是 x
增加 1。
表达式
*p++ = c
被解析为
(*(p++)) = (c)
和评估好像写成1
t = p
*t = c
p = p + 1
需要注意的是,*t = c
和 p = p + 1
可以以任何顺序相互发生,并且 p
仅计算一次。
同样,
*++p = c
被解析为
(*(++p)) = c
并评估为好像写成
t = p + 1
*t = c
p = p + 1
注意事项同上。
- 这是评估的逻辑描述,不一定是编译器生成的代码。编译器可能会安排一些事情,这样它就不会使用临时文件来存储“p”的当前值。