2017-05-25 123 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