• ベストアンサー

C#を教えてください。

何故、実行結果が下記になるのか教えてください using System class Compare{ static void Main(){ int a = 10, b = 20; Console.WriteLine(" a = " + a + " b = " + b) } } 実行結果 a = 10 b = 20 (" a = " + a + " b = " + b) この式の計算の仕方を教えてください。 ご多忙中恐れ入りますが、宜しくお願い申し上げます

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

  • ベストアンサー
  • kteds
  • ベストアンサー率42% (1876/4424)
回答No.5

No.4です。 > aには左右2つ+が付いていてbには左側しか+が付いていません。 そのようにaやbを基点に考えるのではなくて、下記のように「文字列の順番に連結される」と考えてください。 " a = " + a で文字列 " a = 10 " という文字列になります。 " a = 10" + " b = " で 文字列 "a = 10 b= " という文字列になります。 " a = 10 b= " + b で文字列 "a = 10 b= 20" という文字列になります。 --- つまり「連結演算子」は 文字列1 + 文字列2 のように使用して、 左側の文字列1 と 右側の文字列2 を連結します。 連結結果は 文字列1文字列2 という文字列になります。

takakou7979
質問者

お礼

ナルホドですね。 ご回答誠に有難うございます。

その他の回答 (9)

  • wormhole
  • ベストアンサー率28% (1622/5658)
回答No.10

>(" a = " + a + " b = " + b) >"+ a +"ならば"+ b +"と思うのですが 文字列 " a = " 演算子 + 変数 a 文字列 " b = " 演算子 + 変数 b この中のどこに"+ a +"なんてものが出てきますか? あなたのやってる事は、文章を変なところで区切って意味がわからないといってのと変わりません。

  • Nouble
  • ベストアンサー率18% (330/1783)
回答No.9

お詫びの、意味で もう少し、丁寧に 説明しますね。 他言語の、経験から 言えば、 多言語、共通記載的には " a = " & a.ToString() & " b = " & b.ToString() ですね。 で、 お示しは " a = " + a + " b = " + b ですね。 お解りと、思いますが "で、挟むと 其の内側は 文字列と、認識されます。 ので、 " a = " 、" b = "、 共に、 文字列と、認識されます。 さて、此処で 演算結果、一時保管領域と、いう 概念を、持ち出します、 此処では、仮に 「レジスタ」と、 称す事に、します。 正確には、言語毎に 動きが、違うのですが、 概念的に、説明しますね。 先ず、 演算が、開始されると レジスタが、 空に、されます。 次に、 式の、優先順位が 評価されますが、 今回は 演算子優先度が、同じなので、 先頭から、 評価が、開始されます。 先頭から、読み出される事に なったので、 先ずは レジスタ= " a = " が、実行されます。 (※注:此処で、    レジスタ内が、文字列な事が    重要です。) 次は、 + aが、来ますが、 先に、示したように レジスタ内が、文字列なのを 考慮して、 文字列での、演算が 出来るか、見定めます。 出来そうですので +に、&の、動きをさせ、 a は、未指定ながら a.ToString() を、宛がい 数値の、10を、 文字列の"10" に、して、 結果、 レジスタ = レジスタ & "10" と、します、 演算結果は " a = 10" ですね。 次に、 +と、" b = "を、 読み込み、 同様に、 & " b = " と、変え、 レジスタ = レジスタ & " b = " を、実行します、 結果は、 " a = 10 b = " ですね。 次に、同様に +と、bを、 読み込み、 & b.ToString() に、変え、 レジスタ = レジスタ & b.ToString() を、行います。 結果は、 " a = 10 b = 20" ですね。 最後に、 演算が、残ってないので、 結果を、引数と して、 Console.WriteLine に、渡して、 此の、ステートメント(と、言うのかな?)が、 終わります。

takakou7979
質問者

お礼

ご回答誠に有難うございます。

  • Nouble
  • ベストアンサー率18% (330/1783)
回答No.8

あぁ、失礼しました。 私が、 記憶から、取り出す際に、 bの、値を 勘違いしました。 お詫びの上、訂正します、 済みません。 誤記 変数bから、 値を、取り出して 文字列に、読み替えて 末尾に、付け足し a = 10 b = 10 正記 変数bから、 値を、取り出して 文字列に、読み替えて 末尾に、付け足し a = 10 b = 20 訂正します。

  • Nouble
  • ベストアンサー率18% (330/1783)
回答No.7

+は、此の場合 文字列の、末尾に 付け足すようですね。 &と、同等でしょうかね? 動きとしては、 文字列"a="に、 変数aから、 値を、取り出し 文字列に、読み替えて 末尾に、付け足して a = 10 更に、 文字列"b="を、付け足し a = 10 b = 更に、更に、 変数bから、 値を、取り出して 文字列に、読み替えて 末尾に、付け足し a = 10 b = 10 ですね。

takakou7979
質問者

お礼

ご回答誠に有難うございます。 実行結果 a = 10 b = 20 ですよ。 参考書が間違っているのですか?

  • Kaneyan-R
  • ベストアンサー率42% (1249/2913)
回答No.6

> aには左右2つ+が付いていてbには左側しか+が付いていません。 これ「計算」ではなく、「文字を連結」しているだけです。 "わたしは"+"○○"+"人間です。" とすれば、結果は 「わたしは○○人間です。」 となる。 文字列の代わりに変数が入っているのです。

takakou7979
質問者

お礼

ナルホドですね。 ご回答誠に有難うございます。

takakou7979
質問者

補足

(" a = " + a + " b = " + b) "+ a +"ならば"+ b +"と思うのですが どう思考を変えればいいですか?

  • kteds
  • ベストアンサー率42% (1876/4424)
回答No.4

>この式の計算の仕方を教えてください。 この場合の「+」は加算演算子ではありません。 算術計算しているのではなくて「文字列を連結している」と考えてください。 したがって、コンパイラが「+」は「連結演算子」である、と判断して文字列として連結しています。

takakou7979
質問者

お礼

ご回答誠に有難うございます。 マダ、チョット、ピンとこないのですが、この式の構造を教えてください。

takakou7979
質問者

補足

(" a = " + a + " b = " + b) aには左右2つ+が付いていてbには左側しか+が付いていません。

  • Kaneyan-R
  • ベストアンサー率42% (1249/2913)
回答No.3

〉Console.WriteLine(" a = " + a + " b = " + b) 文字列「 a= 」の後にaの値を追加して、その後に文字列「 b= 」を追加、またその後にbの値を追加して、コンソールに出力せよ!ってこと。 aは10で、bは20って定義してるのだから、結果は「a = 10 b = 20」になる。 Console.WriteLine(" a の値は " + a + " bの値は " + b) にしてみてやってみそ。

takakou7979
質問者

お礼

ご回答誠に有難うございます。 少し解りかけてきました。

noname#232800
noname#232800
回答No.2

おらは ("曼珠沙華は " + a + " キンポウゲは " + b) という意味と捉える。 要するに ” と ” でくくられた中身はなんでも良い。 と判断。

  • Nouble
  • ベストアンサー率18% (330/1783)
回答No.1

確認できない、環境に ありながら、横から https://msdn.microsoft.com/ja-jp/library/xf2k8ftb(v=vs.110).aspx http://www.woodensoldier.info/computer/csharptips/45.htm 此を、 試してみて、頂けませんか? using System class Compare{ static void Main(){ int a = 10, b = 20; Console.WriteLine(" a = " & a.ToString() & " b = " & b.ToString()) } }

関連するQ&A

  • C# この文法でコンパイルが通らないのは何故?

    下記のような2つのプログラムがあり、一方はコンパイルが通らず、もう一方はコンパイルが通ります。 文法上の違いはさほどないと思うのですが、何故このような結果になるのでしょうか? /////////////////////////コンパイルNG///////////////////////// using System; class Class1{ public static void Main(){ Class2 x; //違い! Class2 xをここで定義 try{x = new Class2(100);} catch{} Console.WriteLine(x.z); } } class Class2{ public int z; public Class2(int x){ z=x; } } /////////////////////////////////////////////////////////// /////////////////////////コンパイルOK///////////////////////// using System; class Class1{ static Class2 x; //違い! Class2 xをここで定義 public static void Main(){ try{x = new Class2(100);} catch{} Console.WriteLine(x.z); } } class Class2{ public int z; public Class2(int x){ z=x; } } ///////////////////////////////////////////////////////////

  • コンパイラが見つかりません。

    いつも教えて頂きありがとうございます。 C#の勉強を始めました。 コードは下記の通りです。 using System; class Data{ public static void main() { int a; int b; a=2; b=3; a=b; Console.WriteLine(a); } } このコードに間違いないのですが 検索してもどうやってコンパイル(実行) するのか分りません。 ご回答の程、宜しくお願い申し上げます。

  • C# デバッグモード"と"デバッグなしモードで答えが違う。

    //8が2の何乗か求めるプログラム。 using System; class Class1 {  static void Main() {   int a = (int)Math.Log(8.0,2.0);   double b = Math.Log(8.0,2.0);   if(b%1.0==0.0) Console.WriteLine("bは整数です");   else Console.WriteLine("bは整数ではありません");   Console.WriteLine("a={0} b={1}",a,b);   Console.Write("\n何かキーを押して");   Console.Read();   } } 答えはa=3 b=3.0を予想していました。 C#.Net2003でコンパイルして実行した所、 デバッグモードで実行した時の答え:  bは整数です。  a=3 b=3 デバッグなしモードで実行した時の答え:  bは整数ではありません。  a=2 b=3 でした。 ★質問1 これはC#.Net2003のバグなんでしょうか? それとも、私がデバッグモードの仕様をきちんと理解していないだけでしょうか?? ★質問2 8が2の何乗かをint型で解を取得したい場合、 (int)Math.Round(Math.Log(8.0,2.0))のようにわざわざ書かないといけないのでしょうか? 以上、アドバイスよろしくお願いします。

  • Visual Studio 2017C#

    下記のVisual Studio 2017 C# 19行目のXの定義がありません。 と出ました。 11行目で定義していると思うのですけど…。 どういうことなのか教えてください。 ご多忙のところ恐れ入りますが、ご回答のほどよろしくお願いします。 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace jump25 { class Test { public int x = 10; } class Program { public static void Main(string[] args) { Test obj = new Test(); int y = object.x; Console.WriteLine(y); } } }

  • C#のメンバ変数について

    下記のコードで enterName の変数を static void Resurut() のメソッドへの受け渡しが上手くいかず、どなたか修正点を教えて頂けないでしょうか? 【ソースコード】 static class Program { static string enterName; static int cntWin = 0; //勝利回数 static int cntLose = 0; //敗北回数 static int cntDraw = 0; //引分回数 //ユーザー名の入力 static void Main(string[] args) { string enterName = Console.ReadLine(); Console.WriteLine("ユーザ名を入力してください: {0}", enterName); Start(); Resurut(); } *一部省略 static void Resurut() { if (cntWin > cntLose) { Console.WriteLine("{0}さんの総合勝利です", enterName); } else if (cntLose > cntWin) { Console.WriteLine("CPUの総合勝利です"); } else if (cntWin == cntLose) { Console.WriteLine("引き分けです"); } } }

  • C#でコンパイルができない。

    C#のベータ版をセットアップして以下のサンプルプログラムを コンパイルしたところ、エラーがでました。何がいけないのでしょうか?OSはWin98です。 css001.cs(7,3): error CS0117: 'System.Console' does not contain a definition for 'Writeline' using System; プログラムリスト public class CSS001 { public static void Main(string[] args) { Console.Writeline("Hello World"); } }

  • C# マルチスレッドにおける例外処理

    下記のようなデリゲートを利用したマルチスレッドのプログラムを組みました。 しかし、マルチスレッド内で例外がおきても、正常にプログラムが終了してしまいます。 (try-catchでも例外を捕捉できません) マルチスレッドプログラムにおいて、例外を捕捉するにはどうすれば、いいのでしょうか? using System; using System.Threading; class Class1 { delegate void delg(); public static void Main() { delg d = new delg(multi); d.BeginInvoke(new AsyncCallback(call), null); //マルチスレッド開始 System.Threading.Thread.Sleep(500); //マルチスレッドで例外を強制的に投げているので、 //ここまでたどり着く前にアプリケーションが落ちるはず。 //しかし、実際には正常終了。 Console.WriteLine("メインメソッド 正常終了"); } public static void multi() { Console.WriteLine("マルチスレッドで実行中"); throw new Exception(); //例外を強制的に投げる。 } public static void call(IAsyncResult ar) { Console.WriteLine("コールバックメソッド実行"); } }

  • C#について

    using System; class AddressBook: PhoneBook { private string address; public AddressBook() : base() { address=""; } public void Input() { base.Input(); Console.Write("住所?"); string address=Console.ReadLine(); } public void Writes() { base.Write(); Console.WriteLine("住所:{0}",address); } } class kadai62 { public static void Main() { Console.Write("電話帳に入力する人数を入れてください:"); int n = int.Parse(Console.ReadLine()); AddressBook[] pb = new AddressBook[n]; int i; for (i = 0; i < pb.Length; i++) { pb[i] = new AddressBook(); Console.WriteLine("{0}番目を入力してください.", i+1); pb[i].Input(); } Console.WriteLine(); while(true) { Console.Write("どこから探しますか?[1:氏名,2:自宅電話,3:携帯電話,0:終了] "); int t = int.Parse(Console.ReadLine()); if (t == 0) break; Console.Write("探す文字列は?"); string s = Console.ReadLine(); for (i = 0; i < pb.Length; i++) { if (pb[i].Search(t, s)) pb[i].Writes(); } } } } このプログラムで public void Writes() { base.Write(); Console.WriteLine("住所:{0}",address); } のaddressが出力されません・・どうすれば 出力されますか?

  • Visual Studio 2017 C#

    いつも大変お世話になっております。 下記C#コードをVisual 2017 C#で 実行したところ 重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態 エラー CS0103 現在のコンテキストに 'ConsoleWrite' という名前は存在しません。 ClassLibrary1 C:\Users\kouzo\source\repos\ClassLibrary1\ClassLibrary1\Class1.cs 19 アクティブ 重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態 エラー CS0163 コントロールはひとつの case ラベル ('case 1:') から別のラベルへ流れ落ちることはできません。 ClassLibrary1 C:\Users\kouzo\source\repos\ClassLibrary1\ClassLibrary1\Class1.cs 23 アクティブ というエラーが出て実行結果が出ません。 お忙しいところ恐縮ですが、どうかご回答のほどよろしくお願いします。 using System; namespace ClassLibrary1 { public class Class1 class Program { static void Main() { int a; for (a = 5; a <= 8; a++) { ConsoleWrite(a + "÷3=" + a / 3); switch (a % 3) { case 1: Console.WriteLine(":あまりは1です。"); case 2: Console.WriteLine(":あまりは2です。"); default: Console.WriteLine(":あまりは0です。"); break; } } } } }

  • C#の変数の範囲

    C#の変数の範囲 質問させてください。 以下は、ネットに掲載されていたC#の問題です。 ~ここから~ 下記のC#のコードを実行した場合、"Hello World!"と二行表示されます。 using System; class Program { static void Main(string[] args) { string s = "Hello"; Action a = () => Console.WriteLine(s); s += " World!"; a(); Console.WriteLine(s); } これを一行目だけ"Hello"と表示される場合、 Action a = () => Console.WriteLine(s);をどう書き換えればよいでしょうか。 1. Action a = () => Console.WriteLine("Hello!"); 2. Action<string> a = (s) => Console.WriteLine(s); 3. Action a = () => Console.WriteLine(t - " World!"); 4. string t = s; Action a = () => Console.WriteLine(t); 5. Action a = () => { string t = s; Console.WriteLine(t); }; ~ここまで~ 正解は4だそうですが、「何故」そうなるかがわかりません。 汗 私としては、1.4.も題意を満たす気がするのですが・・・。 お知恵をお貸しください。 出展 http://www.atmarkit.co.jp/fdotnet/extremecs/extremecs_07/extremecs_07_10.html

専門家に質問してみよう