1

コードは次のようになります。

char c;  
scanf("%d", &c);  

3 を入力しています...

私の推測では、3が入力されると、それは type と同じintです。
次に、型を char に降格し、c; に割り当てます。

cin 指定子の値を出力して%d3 を生成しましたが、期待どおりのようです。しかし、指定子を使用し
て の値を出力すると、端末では空白になります。これは 1 つの質問です...(1); さらにテストするために、さらに変数を型で宣言し、次のように初期化しました。 c%c
chchar

char ch = 1;  

テストは次のようになります。

(i&j)? printf("yes") : printf("no");  

結果は「いいえ」です。
の値をi&j出力0
1&3ます1。これは別の質問です....(2);
私の質問は(1)と(2)です

4

4 に答える 4

4

あなたは実際に未定義の動作を呼び出しています。

format string を使用することで、パラメーターとしてを期待するように指示し、単一の文字へのポインターを渡します%d。フォーマット文字列に入れているもの以外に、渡すものに関する型情報がないことに注意してください。scanfint*scanf

これにより、サイズ指定された予約を指すアドレスでサイズ指定された値をメモリscanfに書き込もうとする結果になり、(ほとんどのアーキテクチャでは) 範囲外に書き出す可能性があります。intchar

UB を呼び出すと、以降の計算ではすべての賭けがオフになります。

于 2013-02-24T11:22:08.710 に答える
1

scanf() が varargs 関数ではなく、2 番目の引数として int へのポインターを取る単純な通常の関数であるとします。

int noscanf(char *format, int *ptr)
{
  *ptr = 42;
  return 1;
}

int main(void)
{
  char ch;
  int rc;

      // This should *at least* give a warning ...
  rc = noscanf("Haha!" , &ch); 

  return 0;
}

現在、scanf()可変引数関数です。scanf() が (ポインター) 引数の型を判別する唯一の方法は、フォーマット文字列を検査することです。そして %d の意味: 次の引数は int へのポインタであるはずです。そのため、scanf は問題sizeof(int)なくバイトを *ptr に書き込むことができます。

于 2013-02-24T12:17:19.390 に答える
0

そこに変数が表示されませんj。したがってi&j、0になります。そして、はい、もしi == 1そうj == 3ならi & j == 1

于 2013-02-24T11:08:04.457 に答える
0

(i&j)? printf("はい") : printf("いいえ");
ステートメントは、i=1 および j=3 の場合、出力 yes を返します。

そして(1)の質問では、ASCII 3は印刷できないSTX文字用です。

于 2013-02-24T11:20:17.510 に答える