我被批评(没有真正的论据)在我的c代码中使用assign和compare这样比较:
if (!(buffer = malloc(1024))) {
// handle failure
}
而不是:
buffer = malloc(1024);
if (!buffer) {
// handle failure
}
要明确:这不是关于malloc(),而是关于在条件语句中进行分配。
就个人而言,从审美的角度来看,我更喜欢先前的版本。
此外,如果我为了识别当前Linux内核源代码中的类似构造而执行git grep -E "if \(\!\(.* = .*\)\)\) \{"
,我会在条件中找到几百个相同的分配,例如:在net/ipv4/ipconfig.c
:
if (!(d = kmalloc(sizeof(struct ic_device), GFP_KERNEL))) {
rtnl_unlock();
return -ENOMEM;
}
也常用于提升:
// boost/lexical_cast/detail/converter_lexical.hpp
if (!(i_interpreter.operator <<(arg)))
return false;
// boost/iostreams/filter/newline.hpp:
if ((flags_ & f_has_LF) != 0) {
if ((success = boost::iostreams::put(dest, LF)))
flags_ &= ~f_has_LF;
} else if (boost::iostreams::put(dest, CR)) {
if (!(success = boost::iostreams::put(dest, LF)))
flags_ |= f_has_LF;
}
所以 - 除了你的个人观点 - 在一个声明中是否有好的技术论据支持或反对进行作业和比较?
答案 0 :(得分:4)
据我所知,反对你的版本的论点往往是“人们不希望在条件中看到操作”。事实上,当查看类似C的代码时,我需要额外的心理努力来发现socket
,bind
和listen
来电,当它们被填充到if
时,因为我期待if
的条件来检查事情,而不是做事。
但那是关于它的。
答案 1 :(得分:0)
老实说,我没有看到可读性方面的显着差异。实际上,我更喜欢你的。