簡體   English   中英

在傳遞語句參數之前初始化變量如何影響輸出?

[英]How does initializing a variable before passing statement arguments affect the output?

#include <stdio.h>

int main()
{
    int a, b, sum;
    sum = a + b; // initializing variable "sum" here gives incorrect answer to a+b
    printf("Enter value a: ");
    scanf("%d", &a);
    printf("Enter value b: ");
    scanf("%d", &b);

    printf("sum of %d + %d = %d\n\n", a, b, c);
    return 0;
}

這是一個應該將兩個整數相加的程序。 我注意到,在我在打印和掃描語句中傳遞任何參數之前初始化變量“ sum”時,我的輸出不是變量“ a”和“ b”的正確總和。 但是,當我在打印和掃描語句之后初始化變量“ sum”時,輸出是正確的:

#include <stdio.h>

int main()
{
    int a, b, sum;
    printf("Enter value a: ");
    scanf("%d", &a);
    printf("Enter value b: ");
    scanf("%d", &b);
    sum = a + b; // variable "sum" is initialized after statement arguments
    printf("sum of %d + %d = %d\n\n", a, b, c);
    return 0;
}

所以我的問題是:

  1. 為什么在語句參數之后需要初始化變量?
  2. 變量聲明和初始化的順序背后的實際邏輯是什么?

首先,從未聲明變量“ c”,並且編譯器給出了錯誤。 修改您的代碼。

至於'sum'變量:問題不在於初始化,而在於評估。 在C語言中,表達式評估的順序稱為“ 應用性 ”順序,這意味着所有內部表達式必須在外部表達式之前進行評估。

在您的情況下,訂單者是:我們需要為“ sum”分配一個值,因此必須對其進行評估! 調用加法運算符('+')。 但是還有兩個變量“ a”和“ b”。 但是,它們沒有存儲任何值。 它們尚未初始化 從未初始化的變量中獲取數據的意圖的結果是未知的(稱為未定義行為 )。

如果在賦值表達式調用之前 將數據讀取到'a'和'b'變量,則相同的求值結果將得出正確的答案 ,因為'a'和'b'存儲了一些已定義的數字。

所以...用C編寫時,您應始終牢記評估順序是適用的。 如果您開始玩副作用,那非常重要。 同樣,功能參數的評估順序是不確定的。

在您的第一個代碼中,您剛剛聲明了int變量a和b且未使用任何特定值對其進行初始化,因此它們基本上包含Garbage值,然后立即將它們添加到sum變量中,該變量現在將包含Garbage值。 在此之后,您將輸入a和b,但是將它們添加到sum變量中,因此sum具有垃圾值,並且帶來了未聲明的新變量c,這將在編譯時引發錯誤

在您的第二代碼中,您聲明了a和b,然后對其進行了掃描,然后將輸入值放入a和b中,並將這些新值相加,然后求和,但仍打印未聲明的c值。 如果你寫

  printf("sum of %d + %d = %d\n\n",a,b,sum);

代替

 printf("sum of %d + %d = %d\n\n",a,b,c);

您現在可以看到輸出。 第一個代碼打印垃圾值,第二個代碼打印實際值

為什么在語句參數之后需要初始化變量?

如果默認情況下不使用特定值初始化它們,則它們將保留一些垃圾值,並且對垃圾值進行操作是無用的。此外,在何處初始化它們也無關緊要,這取決於代碼的功能。 我也可以這樣做,因為int a = 5; 在聲明之前。 為了避免這種情況,您可以在聲明它們時初始化它們,或者接受輸入並為其賦值,這樣它們就不會保留垃圾值。

變量聲明和初始化的順序背后的實際邏輯是什么?

以上解釋說明了自己。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM