• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:初心者です、教えてください)

初心者の疑問:intとlongの計算について

このQ&Aのポイント
  • 初心者の方が「わかりやすいjava」を使って独習していて、intとlongの計算につまづいています。
  • 質問のコードでは、int型の変数「n」に5を代入し、long型の変数「a」に10を代入しています。
  • ただし、int型とlong型の演算では、int型の値がlong型に自動変換されてから演算が行われます。

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

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

http://okwave.jp/qa/q6373223.html ちょうど関連した話が最近ありました こういう式は決められた順番に実行されます。 この式は 1) n+a を計算する 2) 結果を mに代入する の順番で実行されます。 まずは1) nはintの5,aはlongの10なので、 http://www.y-adagio.com/public/standards/tr_javalang2/conversions.doc.html#170983 に従って「5L + 10L と自動変換され」、15Lとなります。 この時点では何の問題もありません。 m はまったく関係ありません。 つぎは2) ここで m = 15L となるのでエラーになります。 ここで比較されているは、 nの5でもaの10Lでもなく、15Lです。 > こういう細かい疑問はいちいち気にしないで飛ばした方がいいでしょうか? ケースにもよりますが 計算の時の(暗黙の)ルールというのはプログラミングの上で結構重要です。 納得いくまで確認するのがよいと思います。 余談ですが。 言語によっては、あなたが最初に思ったように 型が違うと演算できない(明示的に変換が必要)だったり、逆にそういう変換ルールがまったくなかったり、といろいろです。 整数÷整数がどうなるか、といったのも言語によって違いがあります。(1/2が 0.5になるもの、0になるもの等)

loolo
質問者

お礼

とてもわかりやすい回答をありがとうございました。 ほかの言語の話も参考になりました。 >ケースにもよりますが 計算の時の(暗黙の)ルールというのはプログラミングの上で結構重要です。 納得いくまで確認するのがよいと思います。 ありがとうございます。そうします。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 例外処理について

    続けて質問です…すみません; public class OddEven { private static boolean even(int k) { return k/2*2 == k; } public static void main(String[] args){ int l; int m=0; int n=0; try{ for(l=0;l<args.length; l++) { int a = Integer.parseInt(args[k]); if(even(a)) { m++; } else{ n++; } } }catch (NumberFormatException e) { System.out.println("<" + e + ">"); } System.out.println("Even = " + m); System.out.println("Odd = " + n); } } とし、例えば「1 2 3 a 5」の中の偶数奇数の個数を判定すると、奇数が2個、偶数が1個となり、例外処理されたaの後の5が奇数にカウントされないのですが、どのように修正すればよろしいのでしょうか?

    • ベストアンサー
    • Java
  • 静止的フィールドについて教えてください

    教えてください。以下のプログラムだとして、 class Box { static int a = 0 ; int b = 0 ; int c = a+4; } class sample { public static void main(String[] args) { Box n = new Box() ; n.a-- ; n.b-- ; n.c[1]-- ; System.out.println("n.a= "+n.a);//-1 System.out.println("n.b ="+n.b);//-1 System.out.println("n.c[2]="+n.c[2]);//4 Box m = new Box() ; m.a++ ; m.b++ ; m.c[2]++ ; System.out.println("n.a ="+n.a);//0 System.out.println("n.b ="+n.b);//-1 System.out.println("n.c[2] ="+n.c[2]);//4 System.out.println("m.a ="+m.a);//0 System.out.println("m.b ="+m.b);//1 System.out.println("m.c[2] ="+m.c[2]);//4 } } Box nの中のn.aの値はわかります。 ですが、Box mの中のn.aは、a がstaticフィールド(?)なので元の0に戻りますが、m.aがなぜ0なのかわかりません。 そもそもstatic int = ●; のときは、静止的intと教わったのですが、どういう現象が起こるのかいまいちです。 よろしくお願いします。

    • ベストアンサー
    • Java
  • すいません。超初心者です…。

    今、プログラミングの練習をしています。言語はjavaです。独学なので、立ち止まったら対処ができません。一応、本の通りにやっているつもりなのですが… 本を書き写した所、コンパイル(コンパイラ?、インタープリタ?)が出来ません。 お分かりの方がいらっしゃいましたら、是非ご教授下さい。お願いします。 class Test{ int i = 10; int j = i * 2; int sum(int m){ return j + m; } int sum3(int m,int n){ int k = sum(3); return m + n + k; } } public class sample31{ public static void main(String[] args) { Test t = new Test(); System.out.println("tオブジェクトのメソッド" + "sum3(1,5)の結果:" + t.sum3(1,5)); } } ちなみにエラーの文は、 C:\Source>java sample31 Exception in thread "main" java.lang.NoSuchMethodError: Test.sum3(II)I at sample31.main(sample31.java:17) という風に出ています。(意味は分かりませんが…)

    • ベストアンサー
    • Java
  • どこがダメなんでしょう

    入力した数字 1 2          3 4 を        -2  1        1.5 -1 と出力したいんです  public class Re1{ public static void main(String args[]){ double n1=Double.parseDouble(args[0]); double n2=Double.parseDouble(args[1]); double n3=Double.parseDouble(args[2]); double n4=Double.parseDouble(args[3]); double a=n1*n4-n2*n3; double b=1/a; double q[][]={{n4,-n2}, {-n3,n1}}; double l[][]=new double[2][2]; for(int i=0; i<l.length; i++){ for(int j=0; j<l[i].length; j++){ l[i][j]=0; l[i][j]=b*q[i][j]; } } for(int i=0; i<l.length; i++){    for(int j=0; j<l[i].length; j++){ System.out.print(l[i][j]+" "); } System.out.println(); } } } お願いします。

  • switch で疑問。java超初心者です。

    まず、 public class P1{   public static void main(String[] args){     int n = 1;       switch(n){         case 0:           System.out.println("あ");           break;         case 1:           System.out.println("い");           break;         case 2:           System.out.println("う");           break;         default:           System.out.println("え");       }   } } は、当然「い」と表示されますよね。 default: をcase 3:にしても、問題なく「い」と表示されました。 そこで、こんな風にしてみました。 public class P3{   public static void main(String[] args){     int n = 1;     String s;       switch(n){         case 0:           s="あ";           break;         case 1:           s="い";           break;         case 2:           s="う";           break;         default:           s="え";       }       System.out.println(s);   } } これは「い」と表示されましたが、 default: をcase 3:にすると、エラーとなってしまいます。なぜでしょう。 ちなみに、エラーの内容は 変数 s は初期化されていない可能性があります。     System.out.print(s);                ^ というものでした。 そこで、 変数 s を初期化してみようと、次のように変数 s の宣言の後に null を代入しました。 String s=null; すると、「い」と表示され、エラーは出ません。 なぜ、このようになるのでしょうか。 String型の変数を使っていて、今まではこのようなエラーは出た事が無かったのですが、 どうやらswitch文の中では、初期化しろ、と出てくるようです。 わかり易い解説をいただければと思います。 これは仕様だということで、この通り受け入れるしかないのでしょうか。 勉強していて、少々腑に落ちないので、質問致しました。 よろしくお願いいたします。

    • ベストアンサー
    • Java
  • Java比較演算子はどちらのほうが早いですか。

    「より大きい(>)」と「以上(>=)」はどちらのほうが早いですか。 ハノイの塔の再帰を使って実験してみたところ「より大きい」が遅いという結果になりました。 より大きいは再帰が苦手?ソースが間違ってる?... などと気になったので投稿しました。 プログラミング初心者なのでお手柔らかにお願いします。 以下が使ったソースです。 public class Main{ public static void hanoi(int n, char a, char b, char c){ if(n > 0){ hanoi(n -1, a, c, b); //System.out.println(a + "から" + b + "へ"); hanoi(n -1, c, b, a); } } public static void hanoi2(int n, char a, char b, char c){ if(n >= 1 ){ hanoi(n -1, a, c, b); //System.out.println(a + "から" + b + "へ"); hanoi(n -1, c, b, a); } } public static void main(String[] args){ int count = 0; int count2 = 0; long ns = 0; long n1 = 0; long n2 = 0; while(count2 < 5){ count++; long start = System.nanoTime(); hanoi(3, 'A', 'B', 'C'); long end = System.nanoTime(); long start2 = System.nanoTime(); hanoi2(3, 'A', 'B', 'C'); long end2 = System.nanoTime(); n1 += (end -start); n2 += (end2 -start2); ns = n1 -n2; if(ns > 0) count2++; } System.out.println("「> 」平均:" +(n1 /count)+"ns"); System.out.println("「>=」平均:" +(n2 /count)+"ns"); } }

  • java初心者なのですが

    java初心者なのですが クラスの配列を使用して配列の配列を作りたいのですが class B { double a[]; } class A{ public static void main(String[] args){ B[] a =new B[3]; for(int i=0;i<3;i++){ a[i]=new B(); } a[0].a[0]=3;         ・・ここでエラー a[0].a[50]=9; a[0].a[100]=100; a[1].a[200]=150; a[2].a[300]=250; System.out.println("a[0].a[0]="+a[0].a[0]); System.out.println("a[0].a[50]="+a[0].a[50]); System.out.println("a[0].a[100]="+a[0].a[100]); System.out.println("a[1].a[200]="+a[0].a[200]); System.out.println("a[2].a[300]="+a[1].a[300]); } } ここでエラーと書いたところでjava.lang.NullPointerExceptionというエラーが出ます。 何が間違えているのでしょうか?どうのようにすればエラーがなくなるのか教えてください。

    • ベストアンサー
    • Java
  • 配列に値を入れて表示させたいが

    import java.util.*; class Sample{ public static void main(String args[]){ Scanner std = new Scanner(System.in); System.out.print("クラス数:"); int n = std.nextInt(); int[][]a = new int[n][]; System.out.print("1組の人数");    int m = std.nextInt(); for(int i=0;i<m;i++){ a[i] = std.nextInt(); //ここの部分でコンパイルエラー    System.out.println("(i+1)"+"組"+(i+1)+"番目の点数"+a[i]);   } } } 互換性のない型?と出ますなぜでしょう

    • ベストアンサー
    • Java
  • (汎用的に)行列の積を求めるプログラム

    L*M実行列A , M*N実行列B , M*N実行列C を引数として、A*BをCに代入するプログラムを作りたいと思っています。 具体的には、エラーがでるのはわかっていますがイメージとして void multiply(int L,int M,int N,double A[L][M],double B[M][N],double C[L][N]) {       for(int l=0;l<L;l++)    for(int n=0;n<N;n++)    C[l][n]=0;       for(int l=0;l<L;l++){            for(int m=0;m<M;m++){                   for(int n=0;n<N;n++)       C[l][n]+=A[l][m]*B[m][n];            }      } } という感じです。Cを自分なりに学習したところ、「2次元配列を渡すには行or列数が少なくとも既知でないといけない」のは知識として得ているのですが、ではこの問題を回避して所望のプログラムを書け、と言われると行き詰ってしまいました。 卒論をするにあたり、種々のサイズの行列演算が必要なので、できるだけ効率的な関数を書いておきたいのですが、どうすれば一般の行列の積の演算が可能になるのでしょうか?

  • JAVA初心者です。

    以下の文法でコンパイルエラーが出ます。 添削をお願いします。 import java.util.Random; public class Test{ public static void main(String[] args){ int n; for (n = 0; n < 200; n++){ int i; for (i = 0; i < 38; i++) { Random rnd = new Random(); int ran = rnd.nextInt(10); System.out.print(ran); System.out.print(" "); for (t = 0; t < 200; t++) } System.out.println(); } } }

    • ベストアンサー
    • Java