• ベストアンサー

キャスト演算子について

初心者の初歩的な質問ですが、変数の型を変換するキャスト演算子がありますが本を読んでいて思ったのですが変換した式の型はその後どうなるのでしょう? 例で(前略) ----------------------------   int A =0; /*A=0*/ double B =2; /*B=2.000000*/ A = (int)B; B = 3; ----------------------------- とするとA=2 となりますがこの時のBの型はどうなるのでしょう? キャストを使用すると最初に宣言したdoubleがintになってしまうのか?後で代入した3は最初に宣言したdouble型の「3.000000」?それとも変換したint型「3」? 多分最初のままのような気はしますが。よろしくお願いします。

  • poyo3
  • お礼率66% (538/813)

質問者が選んだベストアンサー

  • ベストアンサー
  • BLK314
  • ベストアンサー率55% (84/152)
回答No.1

キャストとは変数の中身の解釈方法をコンパイラに指示するものです。 変数の中身を変えるものではありません。 したがって Bは3.0(double)のままです。

poyo3
質問者

お礼

やはりそうでしたか。変数の型がそのつど変わると大変ですよね。 回答ありがとうございます。

その他の回答 (1)

  • S117
  • ベストアンサー率40% (18/45)
回答No.2

キャスト演算子は変数ではなく値に作用し、その値を目的の型に沿うよう変換します。 また副作用を起こしません。 つまり、予想の通り最初のままです。 以下解説です。 A = (int)B; ここは Bの値(double型の値2.0)を得る->double型の値2.0をint型へキャスト->int型の値2をAへ代入 と解釈します。 これはそれぞれ(値が期待される場所での左辺値)->(キャスト演算子)->(代入演算子)の作用です。 また、一般にCなどの静的な型付けをする言語では変数の型は不変です。

poyo3
質問者

お礼

一度宣言した型は変わらないわけですね。回答ありがとうございます。

関連するQ&A

  • 文字を整数として扱う場合の演算について質問

    javaの参考書に、文字を整数として扱う場合の演算についての解説があり、疑問点があったので質問します。 質問1:何故char型の変数は、キャストしなくてもint型のリテラルを代入することができるのか?      例えば、 以下の演算はキャストしなくてもこのまま代入できます。 char ch='a'; ch=98; でも、以下の演算はキャストしていないのでエラーになります。      char ch='a'; ch=ch+1; これは何故ですか?参考書に記載されていた理由として、「byte,char,short、 これ等の型の変数や値を使って計算すると、それ等は一度intに直して計算されるから」というような趣旨の事が書いてありました。 つまり、char型の変数には、キャストしない限りint型の数値を代入できないということですよね? でも前者のソースコードは、chはchar型であるにもかかわらず、int型のリテラル98を代入できています。 これは何故ですか? 質問2:javaの参考書に、インクリメント・デクリメント演算子と複合代入演算子は、型を保存するという解説がありました。これはどういう意味ですか? 僕の仮説では、例えば、      char ch='a';      ch+=5; であれば、5は、char型のまま代入されるということでしょうか?

    • ベストアンサー
    • Java
  • C言語signed long long型の演算

    C言語で以下の演算を行った場合、変数bに格納される値が-1(0xFFFFFFFFFFFFFFFF)になることを期待しておりましたが、参照すると4294967295(0x00000000FFFFFFFF)となってしまいます。 unsigned int a = 1; signed long long b; b = a * (-1); 32bit、64bitのUNIX(Solaris)マシンでそれぞれ確認しましたが、どちらも同じ結果となりました。 変数aの型宣言をsigned intにすると変数bが-1(0xFFFFFFFFFFFFFFFF)になることは確認したのですが、unsigned intだとなぜこのような演算結果となるのかが分かりません。 ※8バイト整数に格納する際に先頭4バイトがなぜ0xFFFFFFFFで補完されないのか? ちなみに変数bの型宣言をsigned long intにすると32bitマシンでは-1となりましたが、64bitマシンでは4294967295となってしまいます。 これは32bitUNIXマシンではsigned long intは4バイト領域であるため-1(0xFFFFFFFF)となり、64bitUNIXマシンでは8バイト領域のため前述と同じ結果になるのだと考えますが、なぜ8バイト整数を使用するとこのような演算が行われるのかが分からないので、演算順序や型変換の優先順位がどのように行われいるのか説明できる方教えてください。

  • シフト演算の結果の型

    シフト演算の結果の型は、左オペランドの型ということを聞きました。 この左オペランドの型というのは算術型変換をしてからのか、する前の型なのかどちらなのでしょうか? 例えば int a = -2; unsigned int b = 1; a >> b このときの結果の型は何になるのでしょうか? 算術型変換が起きる前のintになるのか? それとも算術型変換が起きるた後のunsigned intになるのか? 例文としてはおかしい点もあるかもしれませんが よろしくお願いします。

  • double型の比較・キャストについて

    double a; double b; と宣言し、a、bを演算した結果、 if(a==b)とするのはa、bには多少の誤差があるため 使い方が間違っているのはわかりますが、 どういう仕組みで異なるのでしょうか。 double a=0.0と宣言し、 途中a=2.0と代入を行った場合も if(a==2.0)は使用方法が間違っているのでしょうか? どういうときに誤差がでて、どういうときは大丈夫なのでしょうか?

  • どなたか、教えて下さい

    4つの変数a, a1, b, b1(全てint 型)に対して次の演算を実行します a に0 を代入 b に1 を代入 a1 = ~a b1 = ~b その後、4つの変数の値を10進数で表示するプログラムを書いてください。 この問題の考え方を教えて下さい!講習で必ず受ける必要がある講座だったのですが、 全く分からないので考え方をどなたか教えて下さい。宜しくお願いします。

  • Complex.h

    C++Builderで複素数やそれを使った演算を扱っていますが、以下のような使い方が出来ても #include <complex.h> ・ ・ int B=10; complex<double> *A = new complex<double>[B]; 次のような動的な配列の宣言が出来ません。 #include <complex.h> int B=10; int C=500; ・ ・ complex<double> *A = new complex<double>[B][C]; E2034’complex<double>(*)[500]'型は’'complex<double>*'型に変換できない とのエラーが出ます。 正しい、複素数行列の宣言の仕方を教えてください。

  • C# int→byte のキャスト

    プログラミング初心者です。 int型の変数に255以上の値を代入し、byte型の変数にcastするとbyte型の変数に代入される値はint変数の値から256を引いた値になります。なぜですか、またどういう仕組みでcastは行われるんですか?

  • C言語のキャストについて

    C言語のキャストについて こんばんわ、質問です。 『キャスト』と言われる型を合わせるルールがあると思います。 あれはコンパイラに 「違う型の変数への代入だけど、これは意図したことですよ」 ってことを分かってもらうための手段という認識でよろしいでしょうか? コンパイル後、実行時には変数の型情報は使われない(残ってない?)と 思っていますが、その道を極めている方、教えてください。 キャストが何に使われるのか知りたいです。

  • 論理演算について教えて下さい。

    基本的な論理演算について教えて下さい。 例えば、変数aにTrueを、変数bにNullを代入し、 a and b をした場合、Nullになるのは、わかるんですが、 a or b をした場合、なんでTrueになるんですか? 又、変数aにFalseを、変数bにNullを代入し、 a or b をした場合、Nullになるのは、わかるんですが、 a and b をした場合、なんでFalseになるんですか? お願いです。教えて下さい。。。 理由がわかりません。。。。

  • 64bit → 32bit型へのキャスト

    long 64data = 1; int 32data = (int)64data; 64bitの変数で上位32bitは使わない場合、int型の変数にキャストして代入することは可能ですか?

専門家に質問してみよう