2011-09-10 27 views
3

にint型や文字を比較割り当てることができます。上記のプログラムではcタイプをintとして割り当てました。そして、最も重要なことに、EOFは、ヘッダ機能で定義された定数であるintegerです。今は、なぜ私は/私はこのようなコードを持っているC

このような何かにコードが変更された場合:

#include <stdio.h> 
    main() 
    { 
    char c; 
    c = getchar(); 
    while (c != EOF) { 
    putchar(c); 
    c = getchar(); 
    } 
    } 

このコードでも動作します! Cのドキュメントの通り、getchar()intを返しますが、上記のコードではcharに保存しています。そしてCコンパイラはエラーを投げません。またwhileループで私はcharであるcとであるEOFを比較しており、コンパイラはエラーをスローせず、プログラムは実行されます。

なぜ上記の2つのケースでコンパイラがエラーをスローしないのですか?

ありがとうございます。

+1

Cは動的ではなく、数値型間の暗黙のキャストを許可します。 2番目のコードは '\ xFF'という文字をEOF(EOF == -1のシステムでは)と解釈しますが、最初の文字はそうではありません。なぜなら、' getchar'がintを使う理由です。 – ughoavgfhw

+1

なぜdownvote? –

+1

@ughoavgfhw私は '\ xFF'である必要はなく、' char'が符号なしのマシンでは、無限ループとしてコンパイルされるかもしれません。 –

答えて

9

いいえつまり、int,の暗黙的にの戻り値がcharに変換されることを意味します。それだけです。

コンパイラは、がsizeof(char)より大きいこのような変換の警告メッセージを生成する可能性があります。たとえば、あなたがGCCと-Wconversionオプションを使用してコードをコンパイルする場合、それはこれらの警告メッセージを与える:

意味
c.c:5:7: warning: conversion to 'char' from 'int' may alter its value 
c.c:8:8: warning: conversion to 'char' from 'int' may alter its value 

、あなたは、このような警告メッセージを避けるためにintを使用する必要があります。

+0

これはどの方法を使用するのに最適ですか? 'char'または' int'? –

+0

これはコードが機能しないことを意味します。それはうまくいくように見えますが、正しい値を簡単に入力して早期に終了させることができます。あるいは、 'char'が符号なしであるアーキテクチャ上にいる場合、ループを終了することはありません。 –

+1

@Ant's:私は自分の答えを更新しました。 – Nawaz

3

号は、これらの動作は、すべての間、新しい コードを追加して、オブジェクトおよび定義を拡張することによって、またはタイプ システムを修正することによって、プログラムの拡張を含むことができるwikipediaの定義

見ますプログラムの実行。これらの動作は、複雑な言語のほとんどすべての言語で にエミュレートできますが、動的言語 は、それらを使用するための直接的なツールを提供します。

C/C++のcharとintはほぼ同じで、C/C++は自動的に2つの間でキャストします。これ以上何もない。タイプシステムの変更はありません。

4

この場合、「動的プログラミング言語」という用語は、あまりにも曖昧に定義されています。

私は、ある数値型から別の数値型への暗黙の変換は、動的言語機能ではなく、構文砂糖だけであると主張しています。

1

は、このプログラムの戻り値はどうあるべき

int main(int argc, char** argv) 
{ 
    char c; 
    c = EOF; /* supposing getchar() returns eof */ 
    return (c == EOF) ? 0 : 1; 
} 

に何が起こっているのか説明するために、あなたのコードを書き換えることができますか? EOFはcharではありませんが、charにキャストします。あなたが比較をすると、そのキャストは再び起こり、同じ値に押しつぶされます。何が起きているのかを明確にするためにこれを書き直す別の方法は、次のとおりです。

#include <stdio.h> 
main() 
{ 
    int c; 
    c = getchar(); 
    while ((char)c != (char)EOF) { 
     putchar((char)c); 
     c = getchar(); 
    } 
} 

EOFが潰れています。どのように押しつぶされても問題はありませんが、文字「M」に押しつぶされる可能性がありますが、毎回同じ方法で押しつぶされるので、それはEOFと見なされます。

0

Cは、あなたが望むことをさせるでしょうが、その結果を受け入れる必要があります。 charにintを代入したい場合は、それを行うことができます。それを動的言語にしません。

(この質問のタイトルは「なぜ私はcharにintを割り当てることができますか?」という最終的な段落を入れるだけですが、十分注意を払う必要はないと思われます。私はタイトルを編集するつもりだったが、それでは質問しないようにしておきます)

+0

笑!申し訳ありませんが、それは初心者の質問だったと確かに@andy私はそのようなタイトルを維持するつもり! –

0

7ビットのASCIIデータを読んでいない場合\ xFFが有効なデータである可能性があります。 EOFが\ xFFFFFFFFでgetchar()の値をcharに戻すと、EOFと\ xFFをデータとして区別できません。

関連する問題