如果我用GCC/Clang編譯下面的C代碼,爲什麼我會得到垃圾值? 請注意,如果我只打印內部範圍內的x的值,我會得到預期的結果。爲什麼我會爲C程序獲取垃圾值?
-2
A
回答
4
在此聲明
int x = x;
標識x
是x
的說明符的完整定義後的聲明的時候已經是可見的分配標誌=
前隱藏了聲明的同名變量在外圍範圍內..
而且你有x
未初始化分配給自己。因此它具有不確定的價值。
你可以想象它通過以下方式
int x;
x = x;
完全同樣的例子在C++標準有(3.3.2點聲明)
1申報的名點緊隨其 完整申報人(第8條)之後及其初始化者(如果有), 之後,除非在下面指出。 [實施例:
int x = 12;
{ int x = x; }
這裏第二個X是可與它自己的(不確定的)值初始化。 末端示例]
在C標準那裏被寫入(6.2.1作用域標識符)
7結構,聯合和枚舉標籤具有該範圍的外觀之後開始只是 類型說明符中的標記聲明 標記。每個枚舉常量的範圍在枚舉器列表中定義的枚舉器出現後立即開始。 任何 其他標識符的範圍僅在其聲明者 完成後開始。
注意枚舉數的定義。統計員的規則是不同的。
該程序良好和枚舉x
將由外部範圍聲明的變量x
被初始化(而枚舉y
將由前述枚舉x
被初始化)。
#include <iostream>
int main()
{
const int x = 10;
{
enum E { x = x + 1, y = x };
std::cout << "E::x = " << x << ", E::y = " << y << std::endl;
}
std::cout << "x = " << x << std::endl;
}
程序輸出是
E::x = 11, E::y = 11
x = 10
0
該聲明int x = 5;
超出了您的第二個區塊的範圍。這意味着,在下面的代碼段
{
int x = x;
printf("%d", x);
}
可變x
是從外部可變x
,在主聲明不同。因此,當您嘗試訪問賦值中的值時,它會給出一個垃圾值,因爲它之前並不存在於此範圍內,因此它未初始化。
相關問題
- 1. 爲什麼Serail.readBytes()讀取垃圾值?
- 2. 爲什麼我總是爲數組獲取垃圾?
- 3. 爲什麼我只能在Ubuntu的G ++中獲得垃圾值?
- 4. C++字符數組 - 爲什麼垃圾?
- 5. 爲什麼printf不打印垃圾值?
- 6. 爲什麼程序不斷打印垃圾值?
- 7. 爲什麼我的char []存儲垃圾?
- 8. 爲什麼我的隨機數程序輸出垃圾?
- 9. 爲什麼我的程序打印垃圾?
- 10. 爲什麼我的最小值顯示一些垃圾值?
- 11. C#/爲什麼Get html會返回隨機垃圾字符?
- 12. 爲什麼我的簡單C程序顯示垃圾到標準輸出?
- 13. 爲什麼讀取PNG圖像時出現垃圾值
- 14. 爲什麼緩衝區複製打印我一些垃圾值?
- 15. 獲取垃圾...
- 16. 當我在這個程序中使用指針時,爲什麼我會得到垃圾? C語言
- 17. 爲什麼Rails應用程序運行垃圾收集器呢?
- 18. 爲什麼垃圾收集在網絡應用程序?
- 19. CUDA程序給垃圾值
- 20. 爲什麼垃圾值不能作爲隨機數?
- 21. PSEXEC返回垃圾結果。爲什麼?
- 22. 爲什麼這是垃圾收集
- 23. 爲什麼禁用垃圾回收器?
- 24. 爲什麼FastBitmap無法收集垃圾?
- 25. 這個fwrite爲什麼寫垃圾?
- 26. 爲什麼我會爲我的輸出獲取空值?
- 27. 獲得垃圾值
- 28. 爲什麼這個堆棧程序在使用POP時給出垃圾值?
- 29. 什麼會導致彙編語言程序顯示「垃圾」?
- 30. 爲什麼OS X 10.7.4要我將應用程序移至垃圾箱?
的'x'範圍是'x',不'x'。 (可能[相關的問題](http://stackoverflow.com/q/14935722)。) –
帶走'int x = 5;'行並且代碼中沒有任何更改。這'x'永遠不會被訪問。 –