我正在尝试使用haskell,在尝试提高代码的可读性时,我突然改变了它的行为.我原以为这两种变体是等价的.
原版的:
f :: Eq c => c -> c -> [[c]] -> [[c]]
f d c acc
| c == d = [] : acc
| otherwise = ([c] ++ (head acc)) : tail acc
split :: Eq a => a -> [a] -> [[a]]
split delim = foldr (f delim) [[]]
Run Code Online (Sandbox Code Playgroud)
这是第二个:
f' :: Eq c => c -> c -> [[c]] -> [[c]]
f' d c (currentWord:wordsSoFar)
| c == d = [] : currentWord : wordsSoFar …Run Code Online (Sandbox Code Playgroud) 我创建了这个类是不可变的,并且具有流畅的API:
public final class Message {
public final String email;
public final String escalationEmail;
public final String assignee;
public final String conversationId;
public final String subject;
public final String userId;
public Message(String email, String escalationEmail, String assignee, String conversationId, String subject, String userId) {
this.email = email;
this.escalationEmail = escalationEmail;
this.assignee = assignee;
this.conversationId = conversationId;
this.subject = subject;
this.userId = userId;
}
public Message() {
email = "";
escalationEmail = "";
assignee = "";
conversationId = "";
subject = …Run Code Online (Sandbox Code Playgroud) 以下简单程序的行为异常。有时它打印“ 0.00000”,有时它打印的“ 0”超出我的计算。有时,它会耗尽系统上的所有内存,然后系统要么终止某些进程,要么由于bad_alloc失败。
#include "stdio.h"
int main() {
fprintf(stdout, "%.*f", 0.0);
}
Run Code Online (Sandbox Code Playgroud)
我知道这是fprintf的不正确用法。应该有另一个参数指定格式的宽度。令人惊讶的是,这种行为是不可预测的。有时似乎使用默认宽度,而有时却非常严重。难道这不能总是失败或总是使用某些默认行为吗?
我在工作中的一些代码中遇到了类似的用法,并花了很多时间弄清楚发生了什么。它似乎仅在调试版本中发生,而在使用gdb进行调试时则不会发生。另一个好奇之处是,通过valgrind运行它会始终导致打印很多“ 0”的情况,否则这种情况很少发生,但是也不会发生内存使用问题。
我正在运行Red Hat Enterprise Linux 7,并使用gcc 4.8.5进行了编译。