none
初始值問題 RRS feed

  • 問題

  • 請問我這段code,(1)的地方可以印出a&b的值,但(2)(3)的地方則出現"使用未指定的區域變數'a' 'b',若是a,b沒有初始化,則為何在(1)的地方可以印出值?在if裡我已經給a,b值了,不就是初始化了嗎?謝謝解答!

                

    public static void Main(string[] args)
            {
                int[,] numbers = new int[3, 4] { { 40, 32, 50, 3 }, { 12, 67, 23, 30 }, { 99, 69, 77, 89 } };
                int Max = numbers[0, 0];
                int a, b;
                for (int i = 0; i < 3; i++)
                {
                    for (int j = 0; j < 4; j++)
                    {
                        if (numbers[i, j] > Max)
                        {
                            Max = numbers[i, j];
                            a = i;
                            b = j;
                            Console.WriteLine(a + "," + b); -------(1)
                        }
                        Console.WriteLine(a + "," + b); --------(2)
                    }
                }
                Console.WriteLine(Max + "\n" + "[" + a + "," + b + "]"); ---------(3)
            }


    2017年1月16日 下午 03:16

解答

  • 這是編譯器的規則,最內圈的(1) a,b 一定會被賦值,所以沒有問題。

    那 (2)(3) 部分,編譯器認為無法確定會被賦值,因為有個 if 擋在那邊,如果那個 if 敘述結果是個 false。那 (2)(3) 的 a,b 不就等於沒有賦值了嗎? 編輯只根據邏輯,他不會在編輯的時候知道 if 條件式的結果是 true or false。故有此編譯時期錯誤。 
    要改變這個行為,你可以宣告為 int a=0; int b=0;  在宣告時期先給予初始值。


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。


    2017年1月16日 下午 03:24
    版主
  • 因為以下的初始化動作只有在if (numbers[i, j] > Max)為真時才會執行, 如果if (numbers[i, j] > Max)不為真, 就會處理未初始化的狀態:

    a = i;
    b
    = j;

    建議所有的區域變數都給予初值

    2017年1月17日 上午 01:53

所有回覆

  • 這是編譯器的規則,最內圈的(1) a,b 一定會被賦值,所以沒有問題。

    那 (2)(3) 部分,編譯器認為無法確定會被賦值,因為有個 if 擋在那邊,如果那個 if 敘述結果是個 false。那 (2)(3) 的 a,b 不就等於沒有賦值了嗎? 編輯只根據邏輯,他不會在編輯的時候知道 if 條件式的結果是 true or false。故有此編譯時期錯誤。 
    要改變這個行為,你可以宣告為 int a=0; int b=0;  在宣告時期先給予初始值。


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。


    2017年1月16日 下午 03:24
    版主
  • 因為以下的初始化動作只有在if (numbers[i, j] > Max)為真時才會執行, 如果if (numbers[i, j] > Max)不為真, 就會處理未初始化的狀態:

    a = i;
    b
    = j;

    建議所有的區域變數都給予初值

    2017年1月17日 上午 01:53
  • 謝謝解答!!
    2017年1月17日 上午 02:52
  • 謝謝解答!!
    2017年1月17日 上午 02:52