关于 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 return_TLE @ 2024-11-28 20:02:11

@chen_z@Vector_Li@XuYueming 应该每一次调用会花费3微秒,所以不能频繁调用


by fangzichang @ 2024-11-28 20:02:14

#define int long long UB,因为我猜你会用标准库。
快谢谢 GNU 的程序员和他们的实现,这么写基本只会有爆空间和常数大的问题,或者说行为和预期一样。
下面那个函数是 UB。我认为会挂分。
cin/cout 同步流不是 UB。混用会挂分。
clock() 常数大。不要放在瓶颈。

洛谷认为我没有正确标记代码部分,所以我加了这一段。

by return_TLE @ 2024-11-28 20:04:01

@__builtin_orz错误的,对于问题4,clock函数的常数是大到无法接受的,不能放在瓶颈


by Br00k5xx @ 2024-11-28 20:05:17

而且,建议在 Linux 下测试 clock() 的速度。


by Vector_Li @ 2024-11-28 20:05:30

@fangzichang 我也记得,define int long long 是 UB


by SSqwq_ @ 2024-11-28 20:05:39

我记得有人今年 J 组 T1 写了类似的函数结果挂零了/yun

所以是不是应该在最后随便 return 一个东西防止 UB


by int_4096 @ 2024-11-28 20:07:22

@SSqwq_ 建议还是加上一个 return -1; 因为函数最好还是要在所有情况都有返回值。


by __builtin_orz @ 2024-11-28 20:08:42

@fangzichang

写在#include
的下面,#define
的作用域在这行之后

by Wzhone @ 2024-11-28 20:11:24

只要在linux底下把各种debug参数全部加好(包括但不限于-Wall -fsanitize=undefined,address)还能够不报错跑过大样例基本上就没问题了

实在不放心可以用arbiter跑一遍,但是CCF做的软件质量属实难评


by fangzichang @ 2024-11-28 20:11:53

@__builtin_orz 只要你作用域里用了标准库就是 UB,,但是(我说了)编译器给了还挺良好的定义,所以没表现出来问题并且基本不会出问题。


上一页 | 下一页