gets、puts确实由于历史遗留问题并不是很好的设计。但abs并不是。因为c/c++中规定了有符号整数与无符号整数的运算结果类型一般为无符号整数,如果abs这种基础运算函数返回无符号整数,那么在表达式中使用了abs很容易让整个表达式变成无符号整数运算,更容易导致错误的计算结果。让abs返回有符号整数在大部分场景下会更加安全,在数值运算中保持数值类型不变通常也更加符合用户的预期。
例如,假设i,j,k均为int,那么对于表达式abs(i)
简单来说,需要运算结果类型保持不变的场合比需要考虑特殊取值避免溢出的场合更普遍,并且前者更简单对用户的负担更小,所以选择了前者。像c#、rust这种有符号和无符号整数类型同时存在的强类型语言中,abs(int)的返回类型一般也是int。
【 在 diogin (design universe...) 的大作中提到: 】
: 普通加减法对应指令,这当然没问题。
: 但是很多标准库函数(比如 gets, puts),就是随手拈来的设计,
: 现在严格的程序很少会去用这类函数。这些就是糟粕。
: ...................