質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

3回答

3544閲覧

C#の標準出力を複数使った場合の仕様について

退会済みユーザー

退会済みユーザー

総合スコア0

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2017/08/09 00:57

C#の学習者です。構文などは一通り学習していますが、コンピュータ内部の処理やコンパイラの仕様についてはあまり学んで来ていません。

早速ですが、以下のコードを見ていて、ふと気になったことがあるので質問させていただきます。

using System; public class Test { public static void Main() { Console.Write("abc"); Console.Write("def"); } }

このコードを実行すると、"abc"を出力してから、"def"が出力されるので、最終的に"abcdef"が出力されます。

ここでふと気になったのですが、"def"を出力する段階になって、プログラムはどうやってコンソールに既に3文字の文字列が出力されていることがわかるのでしょうか?ここでコンソールに既に出力されている文字列の長さがわかっていないと、例えば"adef"のように一部が重なって表示されたりしそうなのですが、そうなっているのを見たことがありません。

ということは、

  • プログラムはなんらかの方法でコンソールに既に表示されている文字列の長さを取得して、文字列が重なって表示されないようにしている。
  • 既に表示されている文字列の長さは保持せずに、新たな標準出力が実行されたら、プログラム以外の何かがコンソールに既に表示されている文字列の後ろに文字列を単純に連結(?)している。

の2つのどちらかではないかと思いました。

調べようにも調べ方がわからないので、質問されていただきました。回答よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

こんにちは。

文字送りなどはプログラムではなく、コンソール側が管理しているものです。
コンソールは一種のタイプライターのようなものだと思ってしまえばいいです。
Console.Write("abc")は単純に「abcと出力するように命令」しているだけなので、直後に「defを出力するように命令」すれば、表示はabcdefとなるだけです。
Console.WriteLine()の場合は「文字列を出力した後、カーソル位置を行頭に戻し、次の行に送る」という命令であると解釈することができます。

投稿2017/08/09 01:20

tamoto

総合スコア4105

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/08/09 03:29 編集

タイプライターやカーソルという説明で大体納得できました!ありがとうございます。 私のイメージでは、`Console.Write("abc");`と書くと、"abc"が一気にまとめて出力されるものだと思っていたのですが、内部的には"a" "b" "c"と順番に1文字ずつ出力されているという認識でよろしいでしょうか? それと、`Console.Write("abc");`と ``` Console.Write("a"); Console.Write("b"); Console.Write("c"); ``` は内部的には全く同じ処理が行われているのでしょうか? いろいろ質問してすみません。
tamoto

2017/08/09 03:49

はい、イメージのほうはその認識で良いと思います。 しかし、"abc"をWriteする場合と"a", "b", "c"を分けてWriteする場合では、「結果は等しい」ですが処理は異なります。 前者は文字通り「"abc"を出力する命令」を1回発行していますが、後者は「一文字を出力する命令」を3回発行しています。 「順番に出力したときの結果を表示する」という処理を担当しているのはコンソール側なので、プログラム側で意識するのは「どのような命令を投げたか」という観点になるのです。
退会済みユーザー

退会済みユーザー

2017/08/09 06:10

`Console.Write("abc");` の場合はWriteメソッドが一度だけ呼び出されて、1文字ずつ出力される ということですね。 ベストアンサーに選ばせてもらいました!
guest

0

コンソールは、次に文字を表示する場所(カーソル)の位置を管理しています。
カーソルの主な動きは、以下の通りです(英語や日本語のように左から右に文字を横書きする場合です。アラビア語のように右から左に文字を書く場合はこれとは異なります)。
・コンソールを新規に開いたとき、カーソルは画面の左上にあります。
・コンソールに1文字出力されると、カーソルは、その文字の右側に移ります。
・改行文字が出力されると、カーソルは下の行の左端に移ります。

文字の幅は文字の大きさとフォントに依存しますから、文字列の長さが判っていてもカーソルを移動する距離は判りません。そこで1文字ずつ順に処理するのが基本動作です。

投稿2017/08/09 01:28

coco_bauer

総合スコア6915

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

コンソールはプログラムに従い「プログラムの実行結果の表示(正確には表示だけではない)」が行われます。
プログラムも必ず「1行毎に実行」されることから、
文字数を認識しなくても一部が重なって表示されたりはしません。

分かりにくい例で言うとコンソールはボーリングのスコア表みたいなもので
スピンで投げようが、何ポンドの球を投げようが
スコア表には1ゲーム(1投)づつの結果を順番に表示しているだけです。

投稿2017/08/09 01:15

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問