当前位置: 首页 > 知识库问答 >
问题:

赋值算子链理解

阚英武
2023-03-14

有人能解释下面代码的输出吗

int a=10;
a = a -= a+= a -= a += a;

output : 10 

我无法理解它是如何给出10的?

共有2个答案

许俊雅
2023-03-14

这里有多种概念在起作用。

  1. 第一个是算子结合性

在编程语言中,运算符的关联性是一个属性,它决定在没有括号的情况下如何对具有相同优先级的运算符进行分组。

赋值运算符是右关联的运算符意味着要计算一个表达式,而不使用带有多个赋值运算符的括号,我们将从右侧开始计算。这决定了优先级。

从技术上讲,我们讨论的是加法赋值=减法赋值-=,这与展开后的赋值运算符相同。

a = a -= a+= a -= a += a;

a = (a -= (a+= (a -= (a += a))));

在您这样更改表达式之后,答案是10

许多流行的编程语言允许表达式a=b成为R-Valueexpression,它返回具有相同类型的L-Value变量的值。

注意:表达式中的所有运算符都有一个返回值,类型类似于函数

a=b中,aL值,因此返回值和类型是a

因此a=b=c相当于a=assign(b,c)其中TypeA assign(TypeA,TypeB)函数签名在大多数情况下可以表示赋值操作。

TypeA assign(TypeA a, TypeB b)

变量的计算从左到右开始。这意味着在解析过程中,解析器将开始用从左到右的值替换变量。

例如在a=(a=a)=

评估的第一个操作符将是最内侧括号中优先级最高的操作符。

记住这些规则,我们可以看到下面的评估

a = a -= a+= a -= a += a;
//after deciding precedence of operators
a = (a -= (a+= (a -= (a += a))));
//after addition assignment expantion
a = (a = a - (a = a + (a = a - (a = a + a))))
//First pass of parser
a = (a = 10 - (a = 10 + (a = 10 - (a = 10 + 10)))) //2nd pass, current a = 10
a = (a = 10 - (a = 10 + (a = 10 - (20))))          //3rd pass, current a = 20
a = (a = 10 - (a = 10 + (-10)))                    //4th pass, current a = -10
a = (a = 10 - (0))                                 //5th pass, current a = 0
a = 10                                             //6th pass, current a = 10

严知
2023-03-14

a=a表示a=a

同样地,a-=a表示a=a-a

我不确定哪种方式是正确的开始,但是如果我用上面的方法从右边转换给定的代码,

   a += a                     >     a = a + a;
   a -= a += a                >     a = a - (a + a);
   a+= a -= a += a            >     a = a + (a - (a + a ));
   a -= a+= a -= a += a       >     a = a - (a + (a - (a + a)));
   a = a -= a+= a -= a += a   >     a = a - a - a + a + a;

其中-a-a a相互抵消,产生a=a,即10

 类似资料:
  • FAQs in section [12]: [12.1] 什么是“自赋值”? [12.2] 为什么应该当心“自赋值”? [12.3] 好,好;我会处理自赋值的。但如何做呢? 12.1 什么是“自赋值”? 自赋值就是将对象赋值给本身。例如, #include "Fred.hpp" // 声明 Fred 类 void userCode(Fred& x) { x = x; //

  • 本文向大家介绍整理Python中的赋值运算符,包括了整理Python中的赋值运算符的使用技巧和注意事项,需要的朋友参考一下 下表列出了所有Python语言支持的赋值运算符。假设变量a持有10和变量b持有20,则:  例如: 试试下面的例子就明白了所有在Python编程语言可供选择的赋值运算符: 当执行上面的程序,它会产生以下结果:

  • 主要内容:基本赋值运算符,扩展后的赋值运算符赋值运算符用来把右侧的值传递给左侧的变量(或者常量);可以直接将右侧的值交给左侧的变量,也可以进行某些运算后再交给左侧的变量,比如加减乘除、函数调用、逻辑运算等。 Python 中最基本的赋值运算符是等号 ;结合其它运算符, 还能扩展出更强大的赋值运算符。 基本赋值运算符 是 Python 中最常见、最基本的赋值运算符,用来将一个表达式的值赋给另一个变量,请看下面的例子: 连续赋值 Python

  • 赋值运算符是指为变量或常量指定数值的符号。赋值运算符的符号为“=”,它是双目运算符,左边的操作数必须是变量,不能是常量或表达式。 其语法格式如下所示: 在 Java 语言中,“变量名称”和“表达式”内容的类型必须匹配,如果类型不匹配则需要自动转化为对应的类型。 赋值运算符的优先级低于算术运算符,结合方向是自右向左;不是数学中的等号,它表示一个动作,即将其右侧的值送到左侧的变量中(左侧只允许是变量,

  • C++提供了几个赋值运算符可以缩写赋值表达式。例如下列语句: c = c + 3 可以用加法赋值运算符(addition assignment operator)“+=”缩写如下: c += 3 +=运算符将运算符右边表达式的值与运算符左边表达式的值相加,并将结果存放在运算符左边表达式的值中。下列形式的语句: variable = variable operator expression; 其中

  • 我在我的. proto文件中定义了一个消息消息。它有两个字段,一个必填字段和一个可选字段。 生成Java代码有其关联的,我有它的两个对象 我的问题是: 当我执行oMessage1=oMessage2时,oMessage1的optionalField的值会发生什么变化? 它会消失吗?(因为oMessage2没有)或 它是否保持不变?(因为oMessage1拥有它,所以赋值运算符注意不要用不存在的字段