这是C的初学者;想问下面哪两个代码更适合打印1和给定数字之间的奇数整数?
// Precond: n > 0
void print_odd_integers(int n) {
int i;
for (i=1; i<=n; i+=2)
printf("%d ", i);
printf("\n");
}
// Precond: n > 0
void print_odd_integers(int n) {
int i;
for (i=1; i<=n; i++)
if (i%2 != 0)
printf("%d ", i);
printf("\n");
}
如果两者都不能说明显“更好”,版本之间会有什么不同的权衡?
答案 0 :(得分:3)
使用第一个循环如果n
不是像INT_MAX
这样的极端情况,也是i
从奇数整数开始的情况,因为它已经跳过了一半数字迭代。
否则使用第二个循环,因为如果n = INT_MAX
,第一个循环将变为无限循环。
答案 1 :(得分:2)
绝对是第一个。
原因:
- 减少代码行数
- 如果有其他处理方式的方法,则主要避免使用分支语句(如果,if if,switch case,...)。
- 两种算法的时间复杂度相同O(n)。所以这主要是代码更加美丽的问题。永远记住,更易读的代码更漂亮。
修改强>
$result = mysql_query("SELECT id_item,id_transaction from transaction_item ")or die("<br/><br/>".mysql_error());
,并i
或INT_MAX
i==INT_MAX-1
答案 2 :(得分:0)
从功能上讲,它们是相同的,所以除非你真的需要最大的性能,否则它并不重要。
但是,跳过if
语句的解决方案效率很高。你正在跳过一半的数字而不需要检查模数的条件。
答案 3 :(得分:0)
由于算术溢出,两个循环都有n == INT_MAX
未定义的行为。
第一个循环可能会为您提供更好的性能
如果您稍后将代码更改为从任意值开始,则第二个循环可能更具可读性(对于初学者而言)并且不易出错。
我会在for
主体周围使用大括号,因为它不是简单的单行语句,而是围绕二元运算符的空格以提高可读性:
void print_odd_integers(int n) {
int i;
for (i = 1; i <= n; i++) {
if (i % 2 != 0)
printf("%d ", i);
}
printf("\n");
}
另请注意,两个循环都会在换行符之前的最后一个数字后输出一个空格,这可能不正确。
您可以通过一次额外测试解决这两个问题:
void print_odd_integers(int n) {
for (int i = 1; i <= n; i += 2) {
printf("%d", i);
if (i == n)
break;
}
printf("\n");
}
答案 4 :(得分:-3)
第二种解决方案是“专业”方式。
你可以改变的一件事是布局:
void print_odd_integers(int n)
{
int i;
for (i=1; i<=n; i++)
{
if (i%2 != 0)
{
printf("%d\n", i);
}
}
printf("End.\n");
system("Pause"); //So you can see what you did :)
}
玩得开心:)!