整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

CSP-NOIP信息学竞赛(12)赋值语句

CSP-NOIP信息学竞赛(12)赋值语句

例:#include<cstdio>

using namespace std;

int main(){

int a,b;

a=1.3;

printf("%d\n",a);

b=a;//赋值

printf("%d\n",b);

}


辑赋值运算符提议(https://github.com/tc39/proposal-logical-assignment)引入以下复合赋值运算符:

a ||=b
a &&=b
a ??=b

现有复合赋值运算符

JavaScript已经有以下复合赋值运算符:

  • 算术赋值运算符:
+=-=*=/=%=**=
  • 按位分配运算符:
&=^=|=
  • 按位移位分配运算符:
<<=>>=>>>=


在我们研究所提出的算符之前,我们必须先绕一小段路,学习之前的"短路"

逻辑运算符| |,&&??所有运算符仅当第一个操作数尚未确定结果时,才计算第二个操作数:



提议的运算符

逻辑赋值运算符的工作方式与其他复合赋值运算符不同:


为什么a | |=b等价于下面的表达式?

a | |(a=b)

为什么不是这样呢?

a=a | | b

前一个表达式具有短路的优点:只有当a的计算结果为false时,才会计算赋值。因此,只有在必要时才执行赋值。相反,后一个表达式总是执行赋值。


示例:使用??=添加缺少的属性

const books=[
  {
    isbn: '123',
  },
  {
    title: 'ECMAScript Language Specification',
    isbn: '456',
  },
];

// Add property .title where it’s missing
for (const book of books) {
  book.title ??='(Untitled)';
}

assert.deepEqual(
  books,
  [
    {
      isbn: '123',
      title: '(Untitled)',
    },
    {
      title: 'ECMAScript Language Specification',
      isbn: '456',
    },
  ]);


示例:分解表达式

考虑以下函数,该函数返回跨多行展开的表达式:

function canContainNumber(value) {
  return typeof value==='number'
    || typeof value==='bigint'
    || typeof value==='string'
  ;
}

assert.equal(canContainNumber(''), true);
assert.equal(canContainNumber(Symbol()), false);

此表达式可以按如下方式分解:

页面嵌套了b页面,给b页面赋值,由于从a页面触发返回值信息赋值b页面某个属性,赋值不能按照传统赋值方法。

错误方法:
document.getElementById("ifsss").val()方法赋值
b页面iframe方法(案例)
<iframe id="ifsss" src="/test/a.html" width="414" height="299"  name="left"></iframe>

解决方法:使用iframe专用id赋值

document.getElementById("ifsss").contentDocument.getElementById("content_id").innerHTML="更改的内容";

此方法非常容易解决问题。