转载的一篇,代码规范

老赵点滴 追求编程之美先做人,再做技术人员,最后做程序员。打造国内最好的.NET技术博客。

谈谈年度最佳代码不管你们信不信,反正我信了

2011-08-05 15:15 by 老赵, 8258 visits

最近有段十分流行的代码,是从江湖传闻身怀八蛋的铁道部发言人王勇平同志的一句名言:不管你们信不信,反正我信了……这是生命的奇迹……它就是发生了所引申出来的。这段代码虽然只是在调侃,但是围绕这段代码也产生了一些讨论(如代码风格,编程规范等等),在此顺手记录一下,就当无聊罢。

这段代码是这样的:

try

{

    if(you.believe(it) == true|| you.believe(it) == false)

    {

        I.believe(it);

    }

}

catch(Exceptionex)

{

    throw newException("It's a miracle!");

}

finally

{

    it.justHappened();

}

代码与原文的对应关系不言自明,从命名风格上看,我们默认其为Java代码。话题主要是围绕在if条件的写法上。

书写风格

先来看看它的书写风格问题。我说这段代码不是老鸟写的,因为老鸟不会把一个布尔表达式跟truefalse直接判断,而会写成:

if(you.believe(it) || !you.believe(it))

于是有朋友提出,把布尔表达式跟truefalse相比较来的更清晰一些,我表示这话并没有什么道理,因为这种读代码的方式是把视角停留在数据层面上:一个布尔表达式返回了布尔型的数据,于是把它和另外一个数据进行比较。如今的编程都在不断强调语义语义的清晰才是真的清晰。我说Java是一门糟糕的语言,主要原因就是指它的表达能力太差,导致写出来的代码体现不出问题的解决方式,让人们把目光都集中在具体每条语句上了,所谓见木不见林C#等现代语言都在强调做什么而不是怎么做,语义上就有很大提高了。

回到目前这个具体问题上,if里面的语义是you.believe(it)的返回结果,而不是它的值与另外一个布尔常量的比较结果。其实这个观点我从初中搞信息学竞赛时就被老师不断强调,今天我同样咨询了同事,他也赞同我的观点。如果您还继续坚持这种写法不太清晰的话,我只能说这只是不适应而已,要让自己适应这类写法,很多人还觉得LINQ不清晰呢,小学生还觉得高中数学的解法不清晰呢。

还有朋友认为,作为编码规范,应该要求这么写,例如:

if(10 == i)

就是说,把常量写在比较操作的左边,并认为这样更有普遍意义。其实这也没有必要,这个习惯是从C语言时代遗传下来的陋习。在C语言里,如果把常量写在比较右侧,并且一不小心把比较操作符(两个等号)写成赋值操作符(一个等号),也可以编译通过,但是结果却大不相同,这给错误排查也会带来许多麻烦。但是,在如今的语言里已经比C语言做的安全多了,所以没必要制定这种规范。把一种语言的标准带入另一种语言不叫做有普遍意义,只是多余。

代码含义

然后要谈的便是代码与那句话的映射关系了,再来仔细读一下这个if子句:

if(you.believe(it) || !you.believe(it))

{

    I.believe(it);

}

需求上来理解,我认为代码应该保证if内部的代码一定会执行。那么现在这个需求肯定会满足吗?不一定,因为you.believe方法可能是有副作用的:如果它第一次调用返回false,而第二次调用时返回true,则if内部的代码就会整段略过,这显然不是铁道部王发言人的意图。因此,有同学提议代码应该是这样的:

if(true|| you.believe(it))

这么做的确可以忽略you.believe(it)的结果,因为它已经被短路了根本不会执行。可能它也能满足需求,但我想更合理的做法可能应该是:

if(you.believe(it) || true)

这段代码与之前的区别就在于you.believe(it)一定会被调用一次,但是无所谓其结果是如何,这充分符合天朝某些部门喜欢装摸作样咨询民意的状况。

扩展思考

最后再来一道扩展思考题吧:有人把你爱,或者不爱我,爱就在那里,不增不减写成了一段C#代码:

if(you.Love(me) || !you.Love(me))

{

    love++;

    love--;

}

有人说,这段代码的if条件本身应该被编译器优化掉,因此会直接执行if内部的代码。还有人说,if内部的代码也会被编译器优化掉。您怎么看,为什么呢?

转载于:https://www.cnblogs.com/21xz/archive/2011/09/23/2186356.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,我可以帮您解决使用C语言编写转载问题的代码。 以下是一个使用C语言编写的简单程序,它可以将十进制数转换为任意进制(2到16进制): ```c #include <stdio.h> void convert(int num, int base) { int rem = num % base; if(num == 0) { return; } convert(num / base, base); if(rem < 10) { printf("%d", rem); } else { printf("%c", rem - 10 + 'A'); } } int main() { int num, base; printf("请输入一个十进制数:"); scanf("%d", &num); printf("请输入您想要转换的进制:"); scanf("%d", &base); printf("转换结果为:"); convert(num, base); printf("\n"); return 0; } ``` 该程序中的`convert`函数递归地将十进制数转换为任意进制,并在转换过程中输出每一位数字或字母。 您可以使用该程序进行测试,并根据需要进行修改和调整。希望这可以帮助您解决您的问题! ### 回答2: 贪心算法是一种求解最优化问题的算法,通过每一步的贪心选择来达到全局最优解。对于求解转载问题,可以考虑使用贪心算法来解决。 首先,我们需要明确转载问题的具体要求。在转载问题中,假设有一组要转载的文章,每篇文章的阅读量和转载成本都不同。我们的目标是选择一部分文章进行转载,使得转载总阅读量最大,同时保持转载总成本不超过一个给定的阈值。 贪心算法的思路是每一步都选择当前局部最优解,从而达到全局最优解。在转载问题中,我们可以按照文章的阅读量进行排序,然后从大到小依次选择阅读量最大的文章进行转载,直到总成本超过给定的阈值或者所有文章都被转载完。 下面是使用C语言实现贪心算法求解转载问题的伪代码: ``` // 定义文章结构体 typedef struct { int id; int views; int cost; } Article; // 按照阅读量从大到小排序的比较函数 int compare_articles(const void* a, const void* b) { Article* article_a = (Article*)a; Article* article_b = (Article*)b; return article_b->views - article_a->views; } // 贪心算法求解转载问题的函数 void greedy_repost(Article articles[], int n, int max_cost) { // 按照阅读量从大到小排序文章数组 qsort(articles, n, sizeof(Article), compare_articles); int reposted_articles = 0; // 已转载的文章数量 int total_views = 0; // 总阅读量 int total_cost = 0; // 总成本 // 依次选择阅读量最大的文章进行转载,直到总成本超过阈值或者所有文章都被转载完 for (int i = 0; i < n; i++) { if (total_cost + articles[i].cost <= max_cost) { reposted_articles++; total_views += articles[i].views; total_cost += articles[i].cost; } } printf("已转载文章数量:%d\n", reposted_articles); printf("总阅读量:%d\n", total_views); } ``` 使用该贪心算法函数,我们可以传入文章数组、文章数量和阈值,得到最大总阅读量和已转载的文章数量。 注意:贪心算法的正确性依赖于问题的特性,不同的问题需要设计相应的贪心策略,有时贪心算法不能得到全局最优解。因此,在实际应用中,需要根据问题的具体情况进行分析和验证。 ### 回答3: 贪心算法是一种在每个步骤都做出局部最优选择的算法。对于转载问题,可以使用贪心算法来寻找最优解。 首先,我们需要定义问题的约束条件和目标函数。在转载问题中,假设有一系列的新闻文章,每篇文章有一个重要度和一个转载费用。我们的目标是选择一些文章进行转载,使得转载的总费用最小,但是仍能满足一定的重要度要求。 一种贪心算法的思路是,对于每一篇文章,我们计算其重要度与转载费用的比值。然后按照这个比值进行排序,选择比值最高的文章进行转载,直到满足重要度要求或者没有更多的文章可选为止。 以下是一个用C语言实现贪心算法求解转载问题的示例代码: ```c #include <stdio.h> #include <stdlib.h> // 定义文章结构体 typedef struct { int importance; int cost; double ratio; } Article; // 比较函数,用于排序 int compare(const void *a, const void *b) { Article *articleA = (Article*)a; Article *articleB = (Article*)b; if (articleA->ratio < articleB->ratio) { return 1; } else if (articleA->ratio > articleB->ratio) { return -1; } else { return 0; } } int main() { // 假设有6篇文章 Article articles[6] = { {10, 5, 0}, {5, 3, 0}, {8, 4, 0}, {15, 8, 0}, {7, 5, 0}, {6, 3, 0} }; // 计算每篇文章的比值 for (int i = 0; i < 6; i++) { articles[i].ratio = (double)articles[i].importance / articles[i].cost; } // 按照比值进行排序 qsort(articles, 6, sizeof(Article), compare); // 选择文章进行转载 int targetImportance = 20; int totalCost = 0; for (int i = 0; i < 6; i++) { if (targetImportance <= 0) { break; } if (articles[i].cost <= targetImportance) { targetImportance -= articles[i].cost; totalCost += articles[i].cost; } } printf("转载的总费用为:%d\n", totalCost); return 0; } ``` 以上代码首先定义了一个文章结构体,包含了重要度和转载费用两个属性,以及一个计算比值的字段。然后使用`qsort`函数对文章进行排序,按照比值从高到低的顺序排序。最后,使用贪心算法思想,从头开始选择文章进行转载,直到重要度要求不满足或者没有更多的文章可选为止。最后输出转载的总费用。 请注意,这个示例代码并非通用解决方案,而是一个示例,实际应用中需要根据具体需求进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值