HM095 缺省三数和

HM095 缺省三数和

HM095 缺省三数和

来源: 第 95 集 函数高级-函数的默认参数

难度: 入门

时间限制: 1s

空间限制: 64MB

题目描述

C++ 允许给形参写默认值。语法是在形参列表里写 类型 名 = 默认值。调用时如果传入了对应实参,必须用传入值;没传才用默认值。

例如 int addThree(int a, int b = 20, int c = 30)

  • addThree(10, 20, 30) 得到 \(60\);
  • 只传 addThree(10) 时 \(b,c\) 用默认值,仍得 \(60\);
  • addThree(10, 30) 时 \(b\) 用传入的 \(30\) 而不是默认 \(20\),再加默认的 \(c=30\),得到 \(70\)。

还有两条规则:

  1. 从左到右补全:某个位置一旦写了默认值,从该位置往右的每一个形参都必须有默认值。它左边可以没有。因此 int f(int a, int b = 10, int c = 20) 合法,int f(int a, int b = 10, int c) 非法;只给最后一个形参默认值合法,只给第一个却不给后面的非法。
  2. 声明与实现只能有一份默认值:函数可以拆成声明和实现。若声明里已经写了默认值,实现里就不能再写;反过来也一样。两边都写(即使数值相同)会报“默认参数重定义”;数值不同还会让编译器不知道该用哪一份,产生二义。

请实现带默认参数的 addThree。另有一份只在声明上写默认值的 addTwo(int a = 10, int b = 10),实现里不再写默认值。再按规则判断形参表和声明/实现是否合法。

输入格式

第一行一个整数 \(q\)(\(1 \le q \le 1000\))。

接下来 \(q\) 行,每行一种询问:

  • C 1 a:调用 addThree(a),输出三数之和。
  • C 2 a b:调用 addThree(a, b),输出三数之和。
  • C 3 a b c:调用 addThree(a, b, c),输出三数之和。
  • R x y z:三个 \(0/1\) 依次表示第 \(1,2,3\) 个形参是否带默认值。按规则 1 判断,合法输出 YES,否则 NO
  • D d i:\(d=1\) 表示声明带默认值,\(i=1\) 表示实现带默认值。两边都为 \(1\) 输出 REDEF,否则 OK
  • S:无参调用 addTwo(),用声明上的默认值计算并输出结果。

整数绝对值不超过 \(10^9\)。保证 C 询问的和在 \(32\) 位整数范围内。

输出格式

每个询问一行,行末换行。

样例

输入 #1

6
C 3 10 20 30
C 1 10
C 2 10 30
R 0 1 1
D 1 1
S

输出 #1

60
60
70
YES
REDEF
20

输入 #2

5
R 0 1 0
R 1 0 0
R 0 0 1
R 1 1 1
D 0 1

输出 #2

NO
NO
YES
YES
OK

说明

  • 传入了就用传入值,没传才用默认值。
  • 某个位置有默认值后,它右边必须都有;左边有没有无所谓。
  • 声明和实现不能同时带默认参数。
  • S 的 \(20\) 来自声明上的 \(10+10\),实现里不得再写一遍默认值。

信息

ID
1094
难度
(无)
分类
(无)
标签
(无)
递交数
0
已通过
0
通过率
?
上传者