先放鏈接:PTA | 程序設計類實驗輔助教學平臺

pta上用c++定義了一個數組,開始我沒賦初值,系統判我運行超時,後來我給數組賦上初值0就答案正確,有哪位大佬解釋解釋啊?

int a[4];這是我剛開始寫的,int a[4]={0};這是我後來改的

pat1019題

代碼如下:

#include&

#include& //string

#include& //sort

#include& //pow

using namespace std;

int main(){

string str;

int d=0,x=0,cha=0;//最大值,最小值,輸入值

int a[4]={0};

cin&>&>str;

int len=str.length();

for(int i=0;i&

a[i]=str[i]-0;

}

if(a[1]==a[2]a[2]==a[3]a[3]==a[0]){

cout&

}else{

while(cha!=6174){

sort(a,a+4,greater&());

for(int i=0;i&<4;i++){

d=10*d+a[i];

x=10*x+a[3-i];

}

cha=d-x;

printf("%04d - %04d = %04d
",d,x,cha);

a[3]=cha%10;

a[2]=(cha/10)%10;

a[1]=(cha/100)%10;

a[0]=cha/1000;

d=0;

x=0;

}

}

return 0;

}


具有自動變數屬性的數組變數,C++ 會對其中的每一個元素進行默認初始化。由於這裡的數組元素是基本 C++ 類型(int),因此:

... otherwise, nothing is done: the objects with automatic storage duration (and their subobjects) are initialized to indeterminate values.

即:數組中的元素會被初始化為不確定值

詳細規則可以參考這裡


初始化問題不說了,前面的答主說的夠了。

至於為什麼會TLE,可以想想輸入的不足四位數會怎樣。結合前面答主所說就可明白。

至於那位說會CE的答主,可能不知道在MinGW或類似編譯環境下std::string確實是可以直接調用的,一般OJ也不太可能使用MSVC做編譯環境。換句話說,不同編譯環境帶來影響有時不可忽視,當然還是建議加上#include &。


因為你把數組聲明在棧上,所以只聲明數組的情況下,只會給這個數組分配存儲位置,但不包括設置這個數組裡面的元素的值這一個動作。所以數組裡面的值是無法確定的,也就是原來該位置的數據是什麼,佔用了這塊存儲的數據就是什麼。

如果你把數組聲明為全局變數(包括函數中聲明的 static 變數),你可以不做任何初始化的動作,那麼就有明確的規定必須存儲單元裏全部被 0 位元組填充(可能是從 c 語言時代延續的約定)。這一步一般是操作系統把可執行文件 load 內存中的過程中就完成了(所以你在可執行文件中實際看不到把全局變數所在的存儲單元清零的代碼,因為載入的時候可讀寫的那個 segment 的內容已經全被清零)。同時,可執行文件中的實際入口點函數在調用用戶入口點(main)之前,會有一個初始化全局變數的動作。因此,當你編程的時候,你的所有全局變數已經全部構造和初始化完畢。


C/C++有規定, 如果只定義數組而不初始化,那麼數組中的值是隨機的(據我觀察0的概率很大);而如果不完全初始化數組(就是你寫的賦初值),規定數組後面的項都是0:

輸出:

若只給前兩個賦值:

輸出:


超時的測試用例沒有給你嗎?你可以模擬輸入""測試一下


這是個有趣的問題,因為你的代碼根本不能編譯通過(Windows + MSVC),卻能夠正常提交,說明這個平臺應該是在編譯時默認添加了一些頭文件防止太多人出現因沒有添加正確頭文件導致的編譯錯誤吧。

那麼問題來了,是誰教你使用std::string的時候添加的頭文件是&呢?

而且直接用str.length()作為遍歷結束的條件難道你不覺得危險嗎?存在越界訪問的風險。

而且我格式化了你的代碼看了看,a數組有沒有初始化其實對於運行時間沒有多大關係,TLE了大概是運氣問題,點背。

至於樓下那些上來連代碼都不看的人的回答,可能是看到「初始化」三個字就直接蹦出的結果。


推薦閱讀:
相關文章