簡體   English   中英

我編譯了這個看似不正確的代碼,但我不明白為什么

[英]I compiled this seemingly incorrect code, but I don’t understand why

我正在Linux機器上學習C ++。 我只是嘗試使用“ int i();”來聲明一個函數,但是卻忘記了對其進行定義。 但是令我驚訝的是,該代碼可以編譯並輸出1.我感到非常困惑。 我嘗試了“ int I {};”,它仍然編譯沒有錯誤。 請幫忙解釋一下。 提前致謝。

 //test1.cpp
#include <iostream>
int main(void)
{
    int i{};
    std::cout << i << std::endl;
    return 0;
}

g++ test1.cpp
./a.out
Output is: 0

//test2.cpp
#include <iostream>
int main(void)
{
    int i();
    std::cout << i << std::endl;
    return 0;
}

g++ test2.cpp
./a.out
Output is : 1

在第一個示例中,您定義了一個名為i的變量,並對其進行了值初始化,對於int來說,它意味着零初始化。

int i{}; // defines i, initialised to zero

在第二個示例中,您聲明一個名為i的函數,該函數不帶任何參數,並返回int

int i(); // declares a function

當您打印此:

std::cout << i << std::endl;

i首先轉換為booli衰減為一個函數non-nullptr指針,然后變為true ),然后將其打印為整數,這就是為什么得到1的原因。 編譯器可以在不定義i情況下進行此轉換(因為結果始終為true ),這就是為什么您沒有鏈接器錯誤的原因。

如果您打算調用此函數並打印結果,則需要使用i()

std::cout << i() << std::endl;

當然,這需要i的定義。

在您的代碼中:

 //test1.cpp #include <iostream> int main(void) { int i{}; std::cout << i << std::endl; return 0; } 

您實際上並不是在未定義函數的情況下就聲明了該函數。 代碼行int i{}; main() function這里是一個名為i int typevariable ,您正在使用brace initializer list來初始化變量i ,不帶任何值,並且在大多數情況下可以為0但因compiler而異。

 //test2.cpp #include <iostream> int main(void) { int i(); std::cout << i << std::endl; return 0; } 

在這種情況下,基本上是同一件事。 您位於main()並且遵循"you can not declare-define a function within a function"的語言規則,因此會導致對variable進行declaration - definition 唯一的區別是您沒有使用brace initializer list ,而是使用了稱為值初始化的ctor constructor函數。 同樣,您沒有傳遞任何值給它,在您的情況下,它分配了一個任意值1

現在,如果您的代碼如下所示:

#include <iostream>

int i();

int main() {
     std::cout << i() << '\n';
     return 0;
}

由於function ideclareddefined因此將無法編譯。 但是,如果您這樣做:

#include <iostream>

// The text in quotes is not meant to be a string literal. It
// is the message of the text that represents any integer X.
int i() { return /*"some int value"*/ 1; }

int main() {
    std::cout << i() << '\n';
    return 0;
}

這將編譯並運行得很好,因為function i都已declareddefined

暫無
暫無

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

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