Arrays 从右到左与指针的关联性

Arrays 从右到左与指针的关联性,arrays,c,pointers,char,Arrays,C,Pointers,Char,我目前正在学习C语言中的指针,但我对从右到左的关联性是如何增加指针还是增加指针所指向的值有点困惑 众所周知,++和*在C中都是从右向左关联的 我不知道*s++如何将数组向前移动1,但是(*s++会增加所指向的值,但不会将数组向前移动 例如: #包括 int main(){ 字符c[20]=“帮助”; char*s; s=c; printf(“初始化:%s\n”,s);//帮助 ++*s; printf(“++*s:%s\n”,s);/“Ielp”第一个元素的ascii增量 ++(*s); pri

我目前正在学习C语言中的指针,但我对从右到左的关联性是如何增加指针还是增加指针所指向的值有点困惑

众所周知,++和*在C中都是从右向左关联的

我不知道
*s++
如何将数组向前移动1,但是
(*s++
会增加所指向的值,但不会将数组向前移动

例如:

#包括
int main(){
字符c[20]=“帮助”;
char*s;
s=c;
printf(“初始化:%s\n”,s);//帮助
++*s;
printf(“++*s:%s\n”,s);/“Ielp”第一个元素的ascii增量
++(*s);
printf(“++(*s):%s\n”,s);/“Jelp”第一个元素的ascii增量
*s++;
printf(“*s++:%s\n”,s);/“elp”移动到数组中的下一个元素
(*s)++;
printf(“(*s)++:%s\n”,s);/“flp”当前元素的ascii增量
*(++s);
printf(“*(++s)\n:%s\n”,s);/“lp”移动到下一个元素
*++s;
printf(“*++s\n:%s\n”,s);/“p”移动到下一个元素
返回0;
}
对于上面的代码,是否有人可以帮助解释发生了什么以及为什么


感谢您的关注。

在dxiv和John Bode的帮助下

在解析表达式时,列在某一行上的运算符与其参数之间的绑定(就像用括号一样)比列在其下一行上的任何运算符都要紧密。例如,表达式*p++被解析为*(p++),而不是(*p++)

在上面的表达式中,值得注意的一点是
+
是一个后缀运算符,其优先级(或优先级)大于
*
(一元运算符)

同一单元格中的运算符(一个单元格中可能列出多行运算符)在给定方向上以相同的优先级求值。例如,表达式a=b=c被解析为a=(b=c),而不是(a=b)=c,因为从右到左的关联性

联想性出现在图片中的另一个例子是
*++p


此处
*
++
(前缀运算符)具有相同的优先级,因此它们将按从右到左的顺序进行计算。

在dxiv和John Bode的帮助下

在解析表达式时,列在某一行上的运算符与其参数之间的绑定(就像用括号一样)比列在其下一行上的任何运算符都要紧密。例如,表达式*p++被解析为*(p++),而不是(*p++)

在上面的表达式中,值得注意的一点是
+
是一个后缀运算符,其优先级(或优先级)大于
*
(一元运算符)

同一单元格中的运算符(一个单元格中可能列出多行运算符)在给定方向上以相同的优先级求值。例如,表达式a=b=c被解析为a=(b=c),而不是(a=b)=c,因为从右到左的关联性

联想性出现在图片中的另一个例子是
*++p


此处
*
++
(前缀运算符)具有相同的优先级,因此它们将按从右到左的顺序进行计算。

只有在不存在括号时,关联性才起作用。如果是,括号中的表达式总是首先求值。类似的原因是
7-3+2=6
但是
7-(3+2)=2
。另外,
*s++
的计算结果为
*(s++)
不是因为关联性,而是因为后缀增量
++
严格地比取消引用
*
操作符更精确。投票以重复的形式结束有几个详细的答案。谢谢@dxiv!关于这个问题的第一个答案是完美的解释。不管出于什么原因,谷歌和其他搜索引擎都不会揭示这一伟大的解释。只有在没有括号的情况下,关联性才起作用。如果是,括号中的表达式总是首先求值。类似的原因是
7-3+2=6
但是
7-(3+2)=2
。另外,
*s++
的计算结果为
*(s++)
不是因为关联性,而是因为后缀增量
++
严格地比取消引用
*
操作符更精确。投票以重复的形式结束有几个详细的答案。谢谢@dxiv!关于这个问题的第一个答案是完美的解释。不管出于什么原因,google和SO搜索都不会揭示这一伟大的解释。从右到左的关联性对于为什么将
*s++
评估为
*(s++)
没有任何作用。这仅仅是从运算符的优先级开始的。@dxiv,但是
*
++
具有相同的优先级,我错了吗?还有一段说,在同一个单元格中的运算符(一个单元格中可能有几行运算符)在给定的方向上以相同的优先级进行计算。例如,表达式a=b=c被解析为a=(b=c),而不是(a=b)=c,因为从右到左的关联性。在链接的表中,后缀
++
具有优先级1,低于取消引用
*
运算符的优先级2。事实上,这正是该链接中给出的示例,请阅读下表中的“解析表达式时…”一段。@IrAM:Prefix
++
与一元
*
具有相同的优先级,因此
*++p
受关联性的影响。后缀
++
的优先级高于一元
*
,因此
*p++
的计算结果为
*(p++)
,与关联性无关。从右到左的关联性与
*s++
被计算为
*(s++)
的原因无关。这仅仅是从运算符的优先级开始的。@dxiv,但是
*
++
具有相同的优先级,我错了吗?还有一段说,在同一个单元格中的运算符(一个单元格中可能有几行运算符)在给定的方向上以相同的优先级进行计算。对于e