看到这段简单的代码后,我想到了这个问题:
if (!x%y)
{
// do something
}
也许这是早期C书(K& R?)的影响,但如果不是那么可爱的话,不是以下总是首选吗?
if (x%y != 0)
{
// do something
}
答案 0 :(得分:7)
This quote回答了您的问题。
“调试是写入的两倍 代码首先。 因此,如果您将代码编写为 尽可能巧妙地,你是 定义,不够智能调试 它。“ - Brian W. Kernighan
答案 1 :(得分:5)
您确定该代码吗? !x%y
表示(!x)%y
,因为!
比%
更紧密。
(仅凭这个原因,我更喜欢x % y != 0
。)
答案 2 :(得分:5)
首先,每个人都注意到(!x%y)
不等同于(!(x%y))
的道具,但更重要的是,它们都不等同于:
if (x % y != 0)
有一个更好的形式:
if (x % y)
我个人尝试不使用==0
替换!
而不引入过多的括号,我绝对不会使用!=0
,但这是一个讨论,开始火焰战争。 : - )
答案 3 :(得分:2)
更喜欢简洁明了。第二个例子x % y != 0
更清楚。
当然,构成清晰度的内容有点主观,但我更喜欢为布尔变量或返回布尔值的函数保留一元!
运算符。
当我编写代码时,我通常会尝试衡量清晰度的方式是问自己:如果1)其他人写的话,我会轻松地阅读和理解这一行吗?2)我必须在2年后再次阅读它这条线。
答案 4 :(得分:2)
应该跳过聪明才智。它不聪明......或者更重要的是可维护。
捷径和简洁可能会或可能不会被接受:我们都采取捷径,但几乎有“行业标准”的捷径,因为我们都这样做。虽然没有聪明的捷径
答案 5 :(得分:1)
在我看来,Clarity每天都在赢得简洁。我有时觉得编写代码如:
if(!(x = func(y)) && ++z == x)
...相当于汽车上更快的条纹。它可能感觉很快,但事实并非如此。我也不认为使用难以理解的变量名(例如在上面的例子中)来节省打字是一个好主意。
这里有什么好处:
for(int x(0) x < managers.size(); ++x)
managers[x]->initialise();
或:
for(int mgr(0); mgr < managers.size(); ++mgr)
managers[mgr]->initialise();
他们都做了同样的事情,有人可能会认为让mgr
更清楚是没有意义的(甚至有其他论据要说mgr
应该更清楚 :)) 。但是,如果这部分例程变得更复杂,那可能非常重要:
for(int mgr(0); mgr < managers.size(); ++mgr)
{
for(int dependentMgr(0); dependentMgr < managers[mgr].dependents().size(); ++dependentMgr)
{
// init these first
}
}
显然,这不是关于是否使用迭代器的讨论,而是仅仅是否应该使用明确的名称。
当我查看一段我以前从未见过的代码时,变量名称就是一切。当我看到tmp
和tempt2
以及vec2
时,我感到畏缩。它们毫无意义。
严重的是,如果你担心自己打字的数量,那就得到一个自动完成的IDE,或者去斐济养鸡:)
答案 6 :(得分:1)
实际上,如果你想让你的代码自我记录(Martin Fowler Style),你可以使用更详细的:
every_player_gets_equal_points = x%y;
if (!every_player_gets_equal_points) { //Some players get more: now base on completion time
答案 7 :(得分:0)
您提供的第一个代码段,...
if (!x%y)
{
// do something
}
...没有意义,因此很可能不正确,因为!x%y
等同于!x
,除了y
等于-1,0或1的情况,并且y
等于0,它是未定义的行为(即%y
通常没有意义)。
其他人已经说过,第一个片段并不等同于第二个冗长的片段。但是,人们可能想知道哪个片段表达了意图。我的观点是,第一个片段并不等同于任何可能正确的内容。
所以这很好地说明了清晰度是一个好主意。
干杯&amp;第h。,