代码1:
#include<stdio.h>
int main()
{
unsigned short i, j, k;
for (i = 0; i < 2; i++)
{
k = i * 4 + 4;
for (j = k - 4; j < k; j++)
printf("%hu ", j);
putchar('\n');
}
return 0;
}
Code1的输出:
0 1 2 3
4 5 6 7
Code1备注:
代码2:
#include<stdio.h>
int main()
{
unsigned short i, j, k;
for (i = 0; i < 2; i++)
{
k = i * 4 + 4;
for (j = k - 4; j < k; j++)
{
printf("%hu", j);
if (j + 1 != k) putchar(' ');
}
if (i + 1 != 2) putchar('\n');
}
return 0;
}
Code2的输出:
0 1 2 3
4 5 6 7
Code2的评论:
Code2的补充说明:
Code2 的问题是该算法始终比较 if 块中的两个值,因此 Code2 效率不高。我想使用 Code1 并更改这些:
CODE3
#include<stdio.h>
int main()
{
unsigned short i, j, k;
for (i = 0; i < 2; i++)
{
k = i * 4 + 4;
for (j = k - 4; j < k; j++)
printf("%hu ", j);
printf("\b\n");
}
putchar('\b');
return 0;
}
这些不会显示 Code2 的相同输出,因为 \ b 不会删除任何内容。
我的问题:
有没有标准方法可以解决我在 Code3 中尝试过的事情?
备注我的问题:
编辑 我不知道为什么我的问题没有用处或建设性。虽然以上是一个随意的小例子,但在处理大量数据时性能可能是一个问题。我认为从控制台输出中删除字符的方法可能会提高性能,并且可能有一种特定的方法。这就是我问这个问题的原因。我可以在答案中写下以下代码。现在我通过注释知道从控制台输出中删除字符是不可能的,因为它取决于实现。
答案 0 :(得分:1)
通常的做法是将第一个或最后一个printf
视为特殊情况(在循环之外):
for(ii=0; ii<2; ii++) {
jj = 0;
printf("%d", jj); // first number printed without space.
for(jj=1; jj<4; jj++) {
printf(" %d", jj); // include the space before the number printed
}
if(ii<2-1) printf("\n");
}
显然,为简单起见,我简化了循环的构造方式和打印方式。您可以制作第一个printf
语句
printf("\n%d", jj);
然后你在输出的开头有一个换行符(通常是一件好事)然后你不需要if
语句 - 你只是在结尾处没有打印换行符line(因为它将在开始时打印...)
执行此操作的方法稍微有点根本不涉及if
语句 - 但这些都是以不太可读的代码为代价的。例如,这里是一个“无循环展开,没有额外的if语句”版本的代码:
#include <stdio.h>
int main(void) {
int ii, jj;
ii = 0;
while(1) {
jj = 0;
while(1) {
printf("%d", jj); // include the space before the number printed
jj++;
if(jj<4) printf("."); else break;
}
ii++;
if(ii<2) printf("*\n"); else break;
}
return 0;
}
输出:
0.1.2.3*
0.1.2.3
基本上我已经采用了for
循环的功能并使其明确;我还使用.
而不是和
"*\n"
而不是"\n"
在打印输出中显示事情的行为符合预期。
如果不对条件进行额外评估,它会按照您的要求进行。它更具可读性吗?不是......
答案 1 :(得分:0)
如果它真的困扰你,你可以稍微展开你的循环,以便将最后一项视为一个特例:
#include<stdio.h>
int main()
{
unsigned short i, j, k;
for (i = 0; i < 1; i++)
{
k = i * 4 + 4;
for (j = k - 4; j < k - 1; j++)
{
printf("%hu ", j);
}
printf("%hu\n", j);
}
k = i * 4 + 4;
for (j = k - 4; j < k - 1; j++)
{
printf("%hu ", j);
}
printf("%hu", j);
return 0;
}
答案 2 :(得分:0)
#include <stdio.h>
int main(){
unsigned short num = 0, to=8;
while(num < to){
printf("%hu", num++);
if(num < to)
putchar(num % 4 == 0 ? '\n' : ' ');
}
#if 0
do{
printf("%hu", num++);
}while(num < to && putchar(num % 4 == 0 ? '\n' : ' '));
#endif
return 0 ;
}
答案 3 :(得分:0)
嗯,试着回答你的问题,我就是这样做的:
for (i = k = 0; i < 2; i++){
if (i > 0) printf("\n");
for (j = 0; j < 4; j++, k++){
if (j > 0) printf(" ");
printf("%d", k);
}
}
我是这样做的,因为我想确定每一行,但第一行以\n
开头,并且每个项目都与前一个项目之间的空格隔开。
另外,我不希望行和列位置与正在打印的内容密切相关。
就性能而言,请记住,这些if
语句的成本约为1个周期,而每个字符的打印成本至少为数百(如果不是数千)。 printf
经历了多层系统调用来解释其格式字符串,构建缓冲区,将缓冲区发送到系统I / O例程,然后导致重新绘制和滚动控制台窗口。得到这个想法?
除非您知道自己有问题,否则不要担心表现。 然后,不要猜。使用诊断。 Here's what I do.