C中的运算符关联性具体为前缀和后缀的递增和递减

PJT*_*PJT 4 c operation associativity

在C操作中,关联性就是增量,减量和赋值.

  2. postfix ++ and -- 
  3. prefix ++ and -- 
  16. Direct assignment = 
Run Code Online (Sandbox Code Playgroud)

完整列表可在此处找到维基百科运营商

我的问题是我们何时拥有

int a, b;

b = 1;
a = b++;

printf("%d", a); // a is equal to 1

b = 1;
a = ++b;

printf("%d", a); //a is equal to 2
Run Code Online (Sandbox Code Playgroud)

当后缀增量运算符应该在直接赋值之前发生时,为什么用b ++等于1?

为什么前缀增量运算符在赋值之前都不同于后缀?

在操作关联性方面,我很确定我不理解一些非常重要的东西.

ken*_*ytm 15

后缀运算符a++将递增a,然后返回原始值,即类似于:

{ temp=a; a=a+1; return temp; }
Run Code Online (Sandbox Code Playgroud)

并且前缀++a将返回新值ie

{ a=a+1; return a; }
Run Code Online (Sandbox Code Playgroud)

这与运算符优先级无关.

(并且关联性决定是否a-b-c等于(a-b)-ca-(b-c).)


AnT*_*AnT 5

运算符优先级和关联性不会告诉您之前发生的事情以及之后发生的事情.运算符优先级/关联性与它无关.在C语言中,诸如"之前"或"之后"的时间关系由所谓的序列点定义,并且由序列点定义(并且这是完全独立的故事).

运算符优先级/关联性只是告诉您哪些操作数属于哪些运算符.例如,表达式a = b++可以被正式解释为(a = b)++a = (b++).运算符优先级/关联性在这种情况下只是告诉您后一种解释是正确的,前者是不正确的(即++适用于b而不是结果a = b).

那再一次,并不意味着b应该先增加.运算符优先级/关联性再一次与"第一次"发生的事情以及"下一次"发生的事情有关.它只是告诉您b++表达式的结果已分配给a.根据定义,b++(后缀增量)的结果是原始b.这就是为什么a得到原始b,即1.当变量b增加时,只要a获得指定b原始值就完全不相关.允许编译器以任何顺序评估这个表达式并随时增加b:任何事情都会发生,只要以a某种方式获得原始b(并且没有人真正关心那种"某种程度上"如何在内部工作).

例如,编译器可以评估a = b++为以下基本操作序列

(1) a := b
(2) b := b + 1
Run Code Online (Sandbox Code Playgroud)

或者它可以如下评估它

(1) b := b + 1
(2) a = b - 1
Run Code Online (Sandbox Code Playgroud)

注意,在第一种情况下b实际上在结束时递增,而在第二种情况下b首先递增.但是在这两种情况下a都获得了相同的正确值 - 原始值b,它应该得到的值.

但我必须重申,上述两个例子仅用于说明目的.实际上,表达式内部a = ++ba = b++没有序列点,这意味着从您的角度来看,这些表达式中的所有内容都会同时发生.没有"之前","之后","第一","下一个"或"最后".这种表达在某种意义上是"原子的",它们不能有意义地分解成一系列较小的步骤.

  • @Prasoon Saurav:每当操作员关联"发挥作用"时,它仍会告诉您哪些操作数属于哪些操作符.实际上,C语言没有"运算符优先级"和"运算符关联性".你不会在标准中找到类似的东西.C语言有一个语法,定义了everythihg."关联性"和"优先性"只不过是试图以更易读的形式呈现语法规则.关联性和优先级都具有相同的根,并做同样的事情. (2认同)