私が書くとき:
if ((1/3) > 0) ...
この条件を真にするために、オペランドの 1 つを (float) にキャストする必要がありますか? または、Cが使用しているデフォルトの変数型は何ですか?
そして、私が書くなら:
if ((1.0/3) > 0) ...
オペランドの 1 つが float でなければならないことをコンパイラが認識したため、状況は変わったのでしょうか?
この条件を真にするために、オペランドの 1 つを (float) にキャストする必要がありますか?
はい、整数リテラルは型int
であり、2 つの型を除算するとint
も返さint
れるため、分数が省略されることを意味します。
オペランドの 1 つが float でなければならないことをコンパイラが認識したため、状況は変わったのでしょうか?
はい、除算のオペランドの 1 つが aになり、除算は精度を維持するためdouble
に a を返すためです。double
(のように、float
リテラルの後に が続きますが、これは質問に関してはあまり重要ではありません。)f
1.0f
接尾辞がない場合、十分に小さい数にはint
ordouble
型があります
a = 42; /* 42 has type int */
b = 42.0; /* 42.0 has type double */
接尾辞を使用して、リテラルの型を指定できます
c = 42U; /* unsigned int */
d = 42.0f; /* float */
e = 42.0L; /* long double */
f = 42ULL; /* unsigned long long (in C99; C89 didn't have long long) */
「1」、「3」、「0」はすべて整数です。
「1.0」は倍精度です。
to の状況の違いは、整数/整数が整数であるのに対し、倍精度/整数は倍精度であることです。