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
統計: 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
#5622698
關於 a 有可能輸出亂數的這邊來解答一下
一般來說 全域變數、靜態變數處於數據區,默認初始化為0 (如果指定初始值,則為指定的值)
而區域變數處於堆棧區,其數值是隨機的,即當時內存中的值。
這裡是VS的測試(全域變數、靜態變數) :
這個是區域變數(像VS這類IDE是不可以編譯的)
這個也是區域變數(但是線上的編譯器就能夠輸出隨機值)

總體來說
不要利用編譯器的這種默認原則
必要的初始化不是笨拙
而是規範
參考來源
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