簡體   English   中英

初學者的 hello world C 程序?

[英]A beginner's hello world C program?

作為初學者,我在 Code::Blocks 上輸入了以下 hello world 程序 -

#include<stdio.h>
main()
    {
        printf("Hello world \n");
    }

現在,我單擊“構建並運行”,輸出屏幕顯示“Hello world”。

但是,我正在閱讀的書建議我刪除程序的某些元素,以查看程序中發生的錯誤。

我做了 2 處更改。 首先,我從程序中刪除了 \n。 (這本書告訴我,沒有\n,運行程序會出錯)但是,當我單擊“構建並運行”時,輸出屏幕給我的輸出與沒有任何錯誤時的輸出相同。

我所做的第二個更改是從程序中刪除#include。 即使是現在,輸出屏幕仍顯示與沒有錯誤時相同的輸出。

為什么會這樣? 請告訴我如何解決這個問題?

我使用的編譯器是 GNU GCC 編譯器。

編輯:按照建議,我添加了 -wall、-wextra、-pedantic。 現在,當我單擊“構建並運行”時,它顯示找不到 -1-wall、-1-wextra 和 -1-pedantic,並且程序無法運行。 現在如何解決這個問題?

案例1:你的書錯了。 刪除\n永遠不會引發任何錯誤。 \n表示換行符,它將在Hello World之后打印一個新行。

情況 2:可能是您沒有再次構建代碼,因為如果不包含stdio (表示標准輸入/輸出),如果您使用較新的 C 標准(C99、C11),您可能不會調用printf()函數。 閱讀更多關於stdio.h的信息。

請注意,在 C99 之前的標准中,如果您刪除原型 ( #include <stdio.h> ),C 將自動為函數提供隱式聲明。 看起來像這樣:

int printf();

意味着,它將接受任意數量的參數並返回int 但在 C99 中,隱式減速被移除。 所以很可能你的編譯器不會面對 C99。

看看這里,編譯好!

閱讀更多關於c 中的隱式聲明

編輯:正如評論中提到的 AnT,刪除#include<stdio.h> ,對 printf 的調用將在 C99 之前的語言版本中“編譯”。 但是,調用將產生未定義的行為。 即使在 C89/90 中,也必須在調用之前使用原型聲明可變參數函數(如 printf)。 否則,行為未定義。

  1. 您的程序已經包含錯誤。 現代 C 中的函數必須用明確指定的返回類型聲明。 您的main()聲明時沒有返回類型,這自 C99 以來一直是非法的。

  2. 有不同種類的“錯誤”。 某些錯誤會導致編譯器發出診斷消息。 一些錯誤只會讓您的程序在運行時表現出不可預測的行為(表現出未定義的行為)。 后者可能更難檢測,因為“不可預測”乍一看可能看起來非常好。

    在您的情況下,刪除#include <stdio.h>將在 C99 編譯器中觸發診斷消息,但只會導致 C89/90 編譯器中的未定義行為。 未定義的行為可能仍會產生與以前相同的屏幕輸出。

刪除 \n 不會有任何問題,因為 '\n' 是換行符。 所以以前你的輸出是 **"Hello World

"** (newline) 現在你的輸出是"Hello World"這就是你看不到任何區別的原因。

刪除\n時沒有出錯的原因是因為它是一個轉義序列,表示換行符。 添加或刪除轉義序列不會導致錯誤,除非代碼的其他部分不受影響。 例如,如果您僅從\ \n中刪除 \,這將導致錯誤,因為您的"將被轉義為\"

對於第二種情況,要么您在運行代碼之前沒有再次構建代碼,要么您的 IDE 將自行設置它。 刪除#include行會導致錯誤,因為您的printf()函數是在stdio.h頭文件中聲明的。 如果沒有函數聲明,調用函數會導致錯誤。


如果您使用任何 shell,最好在文本編輯器中編寫代碼並在 shell 中使用 gcc 編譯它,如下所示:

gcc filename.c

默認情況下,可執行文件將命名為a.out 可以使用man gcc閱讀有關gcc的更多信息。

案例二:

如果沒有#include<stdio.h>中的printf()原型,許多編譯器會使用 C99 之前的標准。 假設該函數具有int printf(...)的原型,其中所有參數(包括格式)都通過通常的參數提升而沒有類型檢查。 由於代碼傳遞了預期的格式參數並返回了int ,因此代碼可以正常工作。 如果代碼是printf(5.0) ,它可能會編譯但在執行時會崩潰。

從“ Hello world \n”中刪除“\n”不會產生任何錯誤,但它可能會在執行時產生不同的結果。 根據操作系統的不同,它可能什么也不寫,直到下一次“\n”被發送到標准輸出,或者直到輸出緩沖區刷新。

#include<Stdio.h> 
//this contains the function used to print which is printf(); also puts();
int main()//The the main function in code simply the one with highest importance
{//opening braces
printf("hello world\n");//this prints the word and \n enters a newline
puts("hello world");//does the exact same thing
return 0; //means if the program runs correctly then return the no zero to screen
}//closing braces
//anything that has those 2 forward slashes are comments and they aren't compiled

嗯,您的代碼似乎沒有任何錯誤,對於第二種情況,您確定要重新編譯嗎?

暫無
暫無

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

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