调代码时需注意可能存在的naive错误
Chinshyo
2022-08-13 23:28:27
上一次更新:2022/8/15
-------
这里收集了本菜鸡日常写代码出的常见问题。考前可以参考,为考场调程序作准备。
## 下标顺手写成i
### Wrong Code
```cpp
while(i < s.size()) {
string tmp;
for(int j = i; j < s.size(); j++) {
if(s[i] >= '0' && s[i] <= '9') tmp = s.substr(i, j - i);
i = j;
break;
}
cout << tmp << endl;
}
```
### Correct Code
`s[i]`改为`s[j]`
## 指针调用函数没加括号
### Wrong Code
```cpp
void upd(node *s1, node s2, node s3) {
int mid = ((*s1).l + (*s1).r) / 2;
*s1.sum = s2.sum + s3.sum;
*s1.lmax = max(st[lcd].lmax, st[lcd].sum + st[rcd].lmax);
*s1.rmax = max(st[rcd].rmax, st[rcd].sum + st[lcd].rmax);
*s1.rmax = max(st[lcd].dat, max(st[rcd].dat, st[lcd].rmax + st[rcd].lmax));
}
```
这里`*`的优先级比`.`的优先级低
### Correct Code
#### Solution 1
```cpp
void upd(node *s1, node s2, node s3) {
int mid = ((*s1).l + (*s1).r) / 2;
(*s1).sum = s2.sum + s3.sum;
(*s1).lmax = max(st[lcd].lmax, st[lcd].sum + st[rcd].lmax);
(*s1).rmax = max(st[rcd].rmax, st[rcd].sum + st[lcd].rmax);
(*s1).rmax = max(st[lcd].dat, max(st[rcd].dat, st[lcd].rmax + st[rcd].lmax));
}
```
#### Solution 2
```cpp
void upd(node *s1, node s2, node s3) {
int mid = ((*s1).l + (*s1).r) / 2;
*s1->sum = s2.sum + s3.sum;
*s1->lmax = max(st[lcd].lmax, st[lcd].sum + st[rcd].lmax);
*s1->rmax = max(st[rcd].rmax, st[rcd].sum + st[lcd].rmax);
*s1->rmax = max(st[lcd].dat, max(st[rcd].dat, st[lcd].rmax + st[rcd].lmax));
}
```
## printf手残加了&
### Wrong Code
```cpp
printf(%d, &ans);
```
### Correct Code
```cpp
printf(%d, ans);
```
## 浮点数误差
C++中浮点运算是存在误差的。如果是整数运算,能避免使用浮点运算尽量避免。
下面这个例子是对于除法的上取整。 $ceil$ 函数对象是浮点数。
```cpp
num = ceil(n / s);
```
应尽量改为:
```cpp
num = (n - 1) / s + 1;
```
这个公式的正确性可以尝试代奇数和偶数进去试验。
---
**未完待续**
~~怎么可能只有这点~~