3

「こんにちは」を表示するプログラムがありますが、その理由がわかりません。

scanf と printf の両方が読み取り/書き込み文字数を返すことは理解していますが、この場合はどのように機能しますか?

void main()
{
    if(printf==scanf)
        printf("hello");
    else
        printf("hi");
}
4

6 に答える 6

13

関数を呼び出して結果を比較するのではなく、関数自体を比較しています。つまり、関数のアドレスを比較しています (関数名は多くのコンテキストで関数ポインターに変換されますが、これは 1 つです)。あなたが書いたものはこれと同じです:

/* this is the correct signature for main by the way, not `void main()` */
int main(int argc, char **argv) {
    /* compare the address of printf to that of scanf */
    if (&printf == &scanf) {
        printf("hello");
    } else {
        printf("hi");
    }
}

scanfとは同じ関数ではないためprintf、異なるアドレスに存在するため、比較は失敗し、出力hiされます。

于 2012-05-29T12:00:20.830 に答える
3

ここで関数のアドレスを比較しますが、関数が同じではないため、等式は成り立ちません。何があなたを混乱させているのかわかりません。

于 2012-05-29T11:59:47.807 に答える
3

if ステートメントでprintforを呼び出していません。scanfむしろ、異なるメモリ内のscanfprintf関数の場所を比較しています (そうでなければ、同じコードを実行し、同じ機能を持っています)。

関数を呼び出した場合にのみ、戻り値が返されます。呼び出しは次のようになります<function_name> ( <arguments separated by commas> )

于 2012-05-29T12:03:38.880 に答える
2

他の人がすでに述べたように、2 つの関数 (この場合は printf と scanf) のアドレスを比較しています。これらの関数は同じアドレスを持つことはできないため、比較は失敗し、プログラムは「hi」を出力します。

以下のコードを試して、理解を深めることができます

int main(void)
{

   printf("printf = %x\n", printf);
   printf("scanf = %x\n", scanf);

   return 0;
}
于 2012-05-29T12:16:57.947 に答える
1

関数のアドレスが関数printfと同じではないためですscanf

于 2012-05-29T11:59:48.103 に答える