先代碼:
#include<iostream>
#include<string>
#include<cctype>
using namespace std;
int main()
{
string s("Hello world!?");
decltype(s.size()) punct_cnt = 0;
for (auto c : s)
if (ispunct(c))
punct_cnt++;
cout << punct_cnt
<< " punctuation characters in "
<< s << endl;
system("pause");
return 0;
}
第一個問題:這個decltype是什麼東西,怎麼個用法?
這是一個類型說明符,用法decltype(expression)
詳細請看
https://blog.csdn.net/zy2317878/article/details/79414096
第二個問題:decltype 後邊的這個s.size() 以及punct_cnt 是啥東西
s.size()是一個傳回類型,傳回string對象的長度(即string對象中字元的個數)
不是int類型,可以肯定的是一個無符号類型的值
是以,這裡傳回一個類型,然後,punct_cnt 就是這個類型,把他的初始值賦為0(即标點符号的個數剛開始是0)
第三個問題:for為什麼這麼用?
這是c++11 的新的語句 for(declaration:expression)
statement;
例如,for(int a : str) //str[]是一個數組
cout << a << endl;
什麼意思呢,就是說,每一次循環,str的一個元素就給了a,然後輸出a,也就是周遊,對str[0]完了以後,接着就是str[1],一直到結束。
這個是最簡單的例子,假如像上邊的,c是s的第一個字元,然後進入if語句,判斷這個字元是不是标點,是标點,就傳回1,然後punct_cnt ++ ,不是的話,c就成了s的第二個字元,一直這樣,一直到結束符為止。
關于這個ispunct函數,它包含在cctype頭檔案中,具體可以看這裡https://blog.csdn.net/zy2317878/article/details/79414096
最後輸出。
我用vs2019,注釋了這個cctype,編譯仍然能通過,并且還能過運作,我很奇怪,能指導的朋友指導指導!感激。