2017-05-25 101 views
0

我发现此c99代码。有人可以解释这里发生了什么吗?需要此代码的一些解释

for(char const * i = "*****";printf("%s\n",i + 4) < 6;i--); 
+0

不准备离开。该代码太糟糕了,无法进行检查。 – ThingyWotsit

+0

Yo初始化一个指向明亮字符串的指针*****'然后你从后面打印字符串 i + 4是因为pinter大小是4位而不是1作为正则字符 –

+0

@ScottHunter不,它声明它是指向const char的指针,指针不是常量 –

回答

1

让我仔细研究该行:

for(char const * i = "*****";printf("%s\n",i + 4) < 6;i--); 

for循环条件第一部分:char const * i = "*****";只是一个指向5级星级人物。 i+1会指向****,i+2会指向***等等。

第二部分打印给定数量的星星:printf("%s\n",i + 4)。通常在for循环的这一部分中,我们使用类似i < n的东西。在这里,而不是i我们得到的结果printf

看一看man 3 printf理解它:

返回值 在成功返回,这些函数返回打印的字符的数目(不包括用于结束输出为字符串的空字节)。

所以基本上我们的printf的i串的更小的部分,直到printf的返回6作为打印的字符数。

+0

谢谢。得到它:D – namila007

+0

Printf必须返回6停止。不是5.但是\ n包含在这里。 – Gerhardh

1

这是它打印: -

* 
** 
*** 
**** 
***** 

要点要记住: -

  • printf没有返回印刷
  • for循环字符的执行,直到条件计算为真
  • 我被初始化为常量字符串的最后一个开始,并且每次迭代向左移动1星
1
This might make it more clear: 

char*i = "12345"; 
int charsPrinted = printf("%s\n", i + 4); 
while (charsPrinted < 6) 
{ 
    i--; 
    charsPrinted = printf("%s\n", i + 4); 
} 

但它很可能会崩溃。要打破循环,charsPrinted必须达到6,这意味着i不再指向字符串开始。这一点并不真正有效。它可能工作,但这取决于。如果没有崩溃,将会打印:

5 
45 
345 
2345 
12345