关于 UB

学术版

SSqwq_ @ 2024-11-28 19:52:54

#define int long long 是不是 UB,会挂分吗。

下面这个函数是不是 UB,会挂分吗。

int f(char x){
    if(x>='0'&&x<='9')return x-'0';
    if(x=='A')return 10;
    if(x=='B')return 11;
    if(x=='C')return 12;
    if(x=='D')return 13;
    if(x=='E')return 14;
    if(x=='F')return 15;
}

关 cincout 同步流是不是 UB,会挂分吗。

clock() 常数大吗。


by XuYueming @ 2024-11-28 19:55:00

@SSqwq_

  1. 不是 UB;
  2. 需要确保 x 的字符集一定是在 if 条件里面,否则 UB;
  3. 不是 UB;
  4. 不知道,觉得比较大。

by return_TLE @ 2024-11-28 19:55:27

@SSqwq_ clock()常数非常大,我之前测试过好像调用一次要花费3us


by return_TLE @ 2024-11-28 19:55:51

3微秒


by XuYueming @ 2024-11-28 19:55:52

@SSqwq_

  1. 小心一点别跟 C 函数混用就没问题,如 getchar(), putchar(), printf(), scanf() 什么的

by Vector_Li @ 2024-11-28 19:56:26

@SSqwq_

  1. 是,不会挂分(long long MLE 不考虑)
  2. 函数中间返回了,不是 UB(我 CF 经常这么写,但我不完全确定)
  3. 不是,不会挂分,我 CSP 写了
  4. 不确定

by chen_z @ 2024-11-28 19:57:48

@SSqwq_ 1、3肯定没问题,2的话防止没有返回值,clock()好像常数贼大,是非常大那种,我昨天模拟赛用了一下,爆搜+卡时原来 0.2s可以跑出来的数据加上 clock() 1s 都跑不出


by Br00k5xx @ 2024-11-28 19:59:38

你要是调用人家一个 cin 的函数或者把所有的 int 改成 long long 就是未定义行为的话 c++ 应该活不到现在把,


by return_TLE @ 2024-11-28 20:00:16

@SSqwq_ 如果可以保证函数的参数是预期的字符就不是ub,如果不是预期的字符而且开启了o2优化的话编译器会假设没有ub,所以认为函数一定会返回一个值,最后的结果是无法预测的,但是按照一般的逻辑应该返回最后一个值15,因为按照编译器的逻辑因为一定会返回一个值并且所有其他的情况都已经返回了所以只能返回15,if(x=='F')语句会被忽略。


by Br00k5xx @ 2024-11-28 20:01:32

建议实践出真知,当然是模拟赛实践不是NOIP)


by __builtin_orz @ 2024-11-28 20:01:39

UB是未定义行为的缩写。

1. #define int long long的行为是明确的,即把int替换为long long,并不是 UB,但应该注意空间复杂度与时间常数。

2. 对于f,如果参数x是非大写十六进制字符,则无返回值,但应该返回int,是UB,为保险起见应添加默认返回值。

3. 关闭流同步是你自己关的,目的很明确,就是关闭iostream与stdio的同步,不是UB。

4. 不大。

| 下一页