簡體   English   中英

printf 在不為格式字符串 C 傳遞變量的情況下以某種方式工作

[英]printf somehow works without passing in variable for the format string C

所以我目前正在學習 C 並且必須編寫一個程序來接收一個字符並檢查它是元音還是輔音。 在執行此操作時,我編譯但忘記將字符傳遞給 printf ,但它仍然以某種方式工作,甚至顯示字符。 任何線索這怎么可能發生或為什么?

#include <stdio.h>
#include <ctype.h>

int main() {
    char chr;
    int ascii;

    printf("Enter a character: ");
    scanf(" %c", &chr);

    ascii = (int) toupper(chr);

    if (ascii == 65 || ascii == 69 || ascii == 73 || ascii == 79 || ascii == 85) {
        printf("%c is a VOWEL.\n");
    } else if (ascii >= 65 && ascii <= 90) {
        printf("%c is a CONSONANT.\n");
    } else {
        printf("%c is not a letter.\n");
    }

    return 0;
}

當調用 function 時,會將 arguments 傳遞給它。 這些 arguments 是根據一些說明它們傳遞位置的規范傳遞的,通常在處理器寄存器或堆棧中。

在最簡單的實現中,被調用的 function 從您應該傳遞 arguments 的位置獲取其參數的值。 當您沒有將所需的值放在正確的位置時,function 會使用那里的任何值。 如果程序碰巧對某個變量使用相同的寄存器,比如ascii ,用於傳遞參數,那么printf可能恰好獲得了所需的值並打印出來。

然而,這只是最簡單的行為。 現代編譯器大大優化了程序,並且可以將 function 調用轉換為如果您的程序具有定義的行為則等效的代碼。 當您有未定義的行為時,這種優化可能會導致您的程序以令人驚訝的方式行為不端。 它可能會打印不正確的值、以錯誤終止或執行與您預期不同的代碼。

為了避免其中一些問題,編譯時啟用大多數警告(GCC 中的-Wall和 Clang 中的至少-Wmost )並提升為錯誤消息( -Werror和 Clang 中的 -Werror)。

暫無
暫無

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

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