2016-12-06 106 views
0
#include <iostream> 
using namespace std; 
int main() 
{ 
char str[] {"TESTING"}; 
char *p {str}; 
cout << (p++, *++p); 
cout << *p++; 
cout << p; 
return 0; 
} 

它返回「SSTING」指針和字符數組混亂

我知道也許這個職位是不完全的計算器,但我無法弄清楚它做什麼,並不能找到任何文件它

cout << (p++, *++p); 

第一次我看到圓括號中有逗號的cout ...他們的功能是什麼?

,應該不是單獨這條線說「測試」,但它似乎只說壽

cout << p; 

謝謝!

+0

的結果'(A,B,C)'爲c。如果有幫助 – pm100

回答

2

讓我們一行一行:

char str[] {"TESTING"}; 

這一行定義了一個名爲類型的str陣列8個字符的,並初始化它與人物TESTING加上NUL字符來標記結束變量。

char *p {str}; 

這一個定義了一個名爲類型的p字符指針變量並將其初始化爲數組str(第一T)的第一個字符的地址。發生這種情況是因爲陣列在大多數用途中會自動衰減爲指針。

cout << (p++, *++p); 

這條線做幾件事。 ,操作員首先評估左手操作員p++,該指針遞增,現在指向E;那麼它會評估右邊的操作符*++p,但這是一個預增加操作符,因此它會再次遞增指針(它指向S)。最後,*運算符訪問p指向的內存,結果是S。並且該字符被打印到STDOUT中。

cout << *p++; 

這個很簡單。 *運算符訪問pS再次指向)的字符並將其打印到STDOUT中。然後它增加指針,因爲它是一個後增量運算符。現在它指向第二個T

cout << p; 

而且至少,這條線輸出字符串指向p,直到找到一個NUL字符。由於p指向陣列中的第二個T,因此它將打印TING

把所有這些輸出放在一起,你會得到SSTING

+0

非常感謝您的詳細解答。你能再解釋一下','操作員嗎?爲什麼在兩者之間打印S(E,S) – user5372775

+0

','操作符實際上很簡單。表達式'E,S'的計算方法如下:先評估'E'並丟棄結果,然後評估'S'並將結果用作完整表達式的值。通常情況下'E'是有副作用的,而不是它的實際價值。 – rodrigo

+0

評估在這種情況下意味着...?所以基本上它只是打印出''的第二部分,'? – user5372775

1

不完全是一個答案,但什麼是做的代碼崩潰,

#include <iostream> 

using namespace std; 

int main() 
{ 
    char str[]{"TESTING"}; 
    char *p{str}; // p points to: 'T' 
    p++;   // p points to: 'E' 
    ++p;   // p points to: 'S' 
    cout << *p; // output a single char: 'S' 
    cout << *p; // ouptut a single char: 'S' 
    p++;   // p points to: 'T' 
    cout << p; // output a (char *) type pointer, AKA a C-string, "TING"; 

    return 0; 
}