阅读本书" C ++ Primer"和维基百科,我注意到两者都提到"优先级和关联性定义了运算符"的分组。然而,在我看来,他们给出的例子显示了OPERANDS的分组。在这里我引用:
来自"定义的术语@ C ++ Primer第5版":
associativity:确定具有相同优先级的OPERATORS的方式 分组。
来自Operator_associativity @ Wikipedia:
考虑表达式a~b~c。如果操作员〜已离开 关联性,该表达式将被解释为(a~b)~c。如果 运算符具有正确的关联性,表达式将是 解释为〜(b~c)。
但是从我看到的情况来看,上面的解释将两个OPERANDS(不是运算符)分组:a和b分为(a~b),或b和c分为(b~c)。因为我看到他们将两个操作数括起来,但不是两个操作符。
鉴于运算符和操作数是不同的概念,优先级和关联性规则组是运算符还是操作数?
提前致谢。
答案 0 :(得分:3)
优先级和关联性解决了语言如何解释涉及三个或更多操作数的无括号表达式。我将使用符号#
和@
来表示两个运算符。考虑表达式
a @ b # c
,x # y @ z
,d @ e @ f
和u # v # w
。请注意,前两个表达式涉及不同的操作数。 C ++优先级规则确定a@b#c
是否被解释为(a@b)#c
或a@(b#c)
,以及x#y@z
是否被解释为x#(y@z)
或(x#y)@z
。
后两个表达式涉及相同的操作数。优先权与此无关。它的关联性决定了d@e@f
是否被解释为(d@e)@f
或d@(e@f)
,以及u#v#w
是否被解释为(u#v)#w
或u#(v#w)
。< / p>
C ++有很多运算符。有一种简单的方法来处理过多的优先顺序:使用括号。我的规则是“每个人都知道a*b+c
表示(a*b)+c
。除了语言律师之外,没有人知道a?b:c=d
是指(a?b:c)=d
还是a?b:(c=d)
。如果有疑问,请使用括号。”
注意:显然,即使微软和维基百科也不知道“a?b:c=d
的意思是什么?”的正确答案,至少截至2014年6月16日。wikipedia和{的优先顺序表{3}}将三元运算符与较低优先级赋值运算符分开,这是不正确的。这意味着a?b:c=d
需要被解释为(a?b:c)=d
,它始终将d
的值分配给b
或c
,具体取决于a
是假的。那是不对的。正确的解释是a?b:(c=d)
。 Microsoft和cppreference.com的优先级表正确地将三元运算符与赋值运算符组合在一起。
有一个更好的解决方案可以解决标准所说的问题:只需使用括号。
答案 1 :(得分:2)
鉴于运算符和操作数是不同的概念,优先级和关联性规则组是运算符还是操作数?
两者。它对操作数和相应的运算符进行分组。在:
(a ~ b) ~ c
您正在由a
运算符对b
和~
进行分组,它们是操作数。但优先级和关联性只是操作数的属性。
答案 2 :(得分:0)
语言的关联性规则指定当表达式中具有相同优先级的两个运算符相邻时,首先计算哪个运算符。
语言的优先级规则指定当两个具有不同优先级的运算符在表达式中相邻时,首先计算哪个运算符。
Wiki说:
[..] 运算符的关联性(或固定性)是属性,它确定在没有括号的情况下如何对相同优先级的运算符进行分组。如果操作数前后都有运算符(例如,
"^ 4 ^"
),并且这些运算符具有相同的优先级,则操作数可以用作两个不同运算的输入(即两个运算符指示的两个运算) )。选择将操作数应用于哪些操作,取决于&#34;关联性&#34;运营商。
这意味着运算符在操作数之间分组,操作数在运算符之间分组。