29. 若執行以下 C 語言撰寫之程式,下列敘述何者正確?#include <stdio.h>
#include <stdlib.h>
#include <iostream>
void funcA(void);
void funcB(void);
int a, b = 2;
int main(void) {
funcA();
printf('%d, %d ', a, b);
funcB();
printf('%d, %d ', a, b);
system('PAUSE');
return 0 ;
}
void funcA() {
int a;
a = 3;
}
void funcB() {
a = 3;
b = 4;
}
(A)呼叫 funcA()之後,輸出為 3,2 並跳行
(B)呼叫 funcB()之後,輸出為 0,2 並跳行
(C)呼叫 funcA()之後,輸出為 0,2 並跳行
(D)呼叫 funcB()之後,輸出為 3,2 並跳行

答案:登入後查看
統計: A(64), B(29), C(107), D(28), E(0) #1187179

詳解 (共 6 筆)

#1605854

因為在funcA 有定義int a ,所以 funcA的 a=3 實際上是改變命名空間 funcA的區域,等funcA結束後,記憶體空間又被殺掉

於是等於全域變數的a並沒改變,比較令人疑惑的點是,全域變數的int a 並未清空,所以是不是0要看記憶體空間配置給a的預設值是不是0

7
0
#4149211
我覺得要實際上來說的話,C的答案也不是很...
(共 95 字,隱藏中)
前往觀看
2
0
#5622698

關於 a 有可能輸出亂數的這邊來解答一下

一般來說 全域變數靜態變數處於數據區,默認初始化為0 (如果指定初始值,則為指定的值)
 而區域變數處於堆棧區,其數值是隨機的,即當時內存中的值。


這裡是VS的測試(全域變數靜態變數) :

6336c773c3925.jpg

這個是區域變數(像VS這類IDE是不可以編譯的)

6336c81ae4ad4.jpg

這個也是區域變數(但是線上的編譯器就能夠輸出隨機值)

6336c93b2f72c.jpg


總體來說
不要利用編譯器的這種默認原則

必要的初始化不是笨拙
而是規範
 
參考來源



1
0
#1408068
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
void funcA(void);
void funcB(void);
int a, b = 2;
int main(void) {
 funcA();
 printf('%d, %d ', a, b);
 funcB();
 printf('%d, %d ', a, b);
 system('PAUSE');
 return 0 ;
}
void funcA() {
 int a;
 a = 3;
}
void funcB() {
 a = 3;
 b = 4;
}
0
0
#5290367

樓上,根據C語言標準,全域變數(Global variables)會預設為0,你說的是針對區域變數

0
0
#1413566
原本題目:29. 若執行以下 C 語言撰...
(共 589 字,隱藏中)
前往觀看
0
0