Q&A¶
ここでは講義中に出た質問に対する回答を載せていきます。随時更新です。
Week1¶
-
出席点はあるか?
- ありません。もしC言語を既に全部理解しているなら、講義に出なくても大丈夫です。宿題だけは全部やってください。宿題・最終レポートのみで成績をつけます。
-
他学部・他学科だが履修可能か?
- 履修出来ます。便覧やUTAS/UTOLをよく読んで取得単位等について確認してください。
-
githubのアカウント名の確認方法がわからないです
- 自分のページを開いたときに
https://github.com/matsui528だとしたらmatsui528の部分です。
- 自分のページを開いたときに
-
githubの個人アカウントは持っているのですが、授業期間中は名前を本名にした方がいいのでしょうか
- しなくても大丈夫です。こちらで紐づけます。
-
スライドとかだと1つのアドレスに対応するのは8bitになっていますが、一つのアドレスに4bitなど他のビット数が対応するような場合はありますか
- 通常のみなさんが扱うコンピュータだと8bitだと思って大丈夫です。
-
アドレスは必ずいつも64bitなのでしょうか
- 64ビットコンピュータの場合はそうです。最近の普通のコンピュータは全て64bitコンピュータですが、10年?前などは32bitコンピュータというものが普通にありました。
-
変数を宣言したときにその変数に対応するアドレスが決まると思いますが、そのアドレスの決め方は何か規則があるのでしょうか。
- これはコンパイラやOSによって決まります。C言語のレベルで皆さんが簡単に知ることは難しいと思います。
-
v / 3 = %f で実行したらv/3 = 41.166668だったのに、v / 3 = %d で実行したらv/3 = -1772391776と出てきました。どうしてですか?
%dは整数を表示するためのものなので、おかしな出力になります
-
charとint、unsigned charとcharなどを使い分ける理由は何ですか?
- charとintは、使うビット数が4倍違うので、メモリ消費量が重要な場面では使い分けが必要になります。unsignedの有無は、(1) charの場合はどは特に、正の値の表現能力が2倍になるので嬉しい場合がいろいろある、(2) ビット演算を用いる際にunsignedのほうが便利な場合がある、などです。
-
pythonのように、height, width = 1,2;としたいのですが、ランダムな巨大整数が出力されてしまいます
- c言語では
A, B = HOGE, FUGAタイプの代入の記述は出来ません(そのような構文はありません)
- c言語では
-
これまでマイコン向けのC言語は使っていたもののパソコン向けのC言語はほぼ触れていない人間です。これまでuint8_tとか書いてきたものを、パソコンではunsigned charと書くのが普通という感じでしょうか。(個人的にはcharは文字のイメージが強く…)
uint8_tのような型は、c言語においてはc99という規格で定められたものだそうです。uint8_tの流儀をとるライブラリもあると思いますが、C言語として最も基本となっているプリミティブな表現はunsigned charのほうです(uint8_tは、存在しない環境がありえる)
-
c3に代入したのは140なのに、なぜ表示されるのは-116なのですか?
- week2でまさに取り上げます。
-
今写経しているコードですが、int area; (改行) area = height * width;と書くのと、int area = height * width;と書くのはどちらが推奨とかはあるのでしょうか?
- 今回の例ではあまり関係ないですが、一般には値が未定義の状態ができないように、宣言と同時に代入する(後者)のほうがよいでしょう
-
main.cを一度コンパイルして、a.outを出力し、次に少しmain.cを編集(printfの中身を変える)して保存し、もう一度コンパイルするとa.outに上書き保存されてしまいますが、上書き保存されず、新しくb.outみたいな別ファイルを作ることはできないのですか?
- パッとは思いつかないのですが、gccにそういうオプションがあれば出来るかもしれないです。できなければ、Makefileというのを書いたりしたら出来ると思います
-
cat usr/include/stdio.hを実行する際は自分のユーザーネームに変えるのですか。それでやってもNo such file or directoryと出ます
- 最初にスラを忘れています。 /usr... です
-
a.outの名前を変えるgccコマンドはありますか?
- gcc main.c -o hogehoge のように -o オプションで出来ます
-
mainじゃなくint mainだとダメですか
- int mainが正しいです
-
""内の文字を"あああ"と変更した後にターミナルで./a.outと入力してもhello, worldと出力されるのですがなぜですか?
- これはコンパイルを失敗していて、古いa.outを実行しているのだと思います。一度a.outを消してみてください。
-
main(){} のmainというのは変えられない決まった名前ですか
- これは決まった名前だと思います。
-
タイピングの繁栄が遅いので再起動したら、main.cなどのファイルがあった場所が消えてしまったのですが、どこにあると思われますか?
- 「ディレクトリを開く」みたいにして「/home/matsui528」のようなところ(matsui528は自分のユーザ名にしてください)を開いてみるとどうでしょうか
-
ターミナルに a.out と打ち込むだけではエラーになってしまうのに対し、 ./a.out と打ち込むとうまく実行ができる理由を教えていただきたいです。「./」はファイルを実行する命令ではないという認識なのですが…
- 良い質問です。week1の最後のほうのコラムに詳しくまとめてあります。
-
#include <stdio.h> main() { printf("Hello, World\n") ; }だとエラーが出て、int を入れて#include <stdio.h> int main() { printf("Hello, World\n") ; }だと実行できるのですがなぜですか- エラーではなく警告です。intをつけるほうが正しいです。どちらでも実行できるはずです
-
main.cをコンパイルしてできるファイルがa.outなのはなぜですか。他のソースをコンパイルしても同じ名前になってしまうし、main.outとかのほうがわかりやすいような気がします。
- その通り過ぎるのですが、昔の慣習だと思います。gcc main.c -o main.out のように-oオプションをつけると名前を変えられます
-
gcc main.cでwarningと書かれたエラーが出ます
- エラーではなく警告です。これはmainの前にintをつけるほうが正しいので、文句を言われています。
-
stdio.hの部分はなんですか。pythonのimportと同じようなものでしょうか
- そうです。printfを使うために必要なものです(しかし実は最近はこれを書かなくてもコンパイルが落ちるわけではなく、printfが使えます)
-
もう一度予測で出てくる"format"の消し方を教えていただけますか
- ここのコラムを参考にしてください
-
ディレクトリとファイルを一度に作ることはできますか
touch aaa/bbb.txtのような書き方は出来ないようです。
-
今やっていることの理解はできるのですが、これらがどういう良さ、利点があるのかがわからないです。
- コマンドのありがたみがわからないということだと思いますが、やっているうちにわかるようになると思います。
-
touchでファイルを作る際。末尾に「.c 」をつけることには何か意味がありますか
- あります。というか、mainとmain.cは別のファイル名です。.cがついていると、c言語のソースコードである、と他のソフトウェアが判断します。
-
cd で具体的なファイル名を入れるときは、相対パスなのでしょうか?
- 絶対パスでも大丈夫です
-
touchやmkdirでpermission denied と出てしまいます
- これは変なファイルを触っていたり、変な位置にいるのかもしれません。cd ~したところでやってみてください。
-
cannot create directoryと表示されてしまいます
- これも変な位置にいるか、同名のファイルが既にある、といった問題なきがします
-
少し遅れた質問になりますが、cppやRustの方が機能が多いというときの機能というのは何を指すのですか?ライブラリの種類が多いとかですか?
- ライブラリもそうですが、コア機能が違います。たとえば「クラス」とか「テンプレート」というコア機能はc++にはありますがcにはありません
-
先生は mv や cp を日常的にファイル移動するのに使いますか?それともfinder やエクスプローラー開いてドラッグしたり ctrl v したりしますか?
- どっちも使います
-
$ cd - 「直前の位置」に戻る。例えば、$ cd /etc/emacsしたあとに$ cd /opt/mavenしてから$ cd -すると、/etc/emacsに戻る。 これについてですが、$ cd /etc/emacsや$ cd /opt/mavenとは何ですか?
- それらはただの例なので、意味はないです
-
現在Untitled-1というファイル名なのですが、ファイル名を変更するにはどうすれば良いでしょうか。
- ファイルを右クリックして名前を変更するか、あるいはファイルをクリックしてF2キーでかえられます。mvでも変えられます。
-
cdがつくやってみようをするとbash: cd.: command not foundと表示されるのはどういう意味ですか?
- cd.. ではなく cd .. です(スペースが必要)
-
ホーム位置というのは何で決まっているのですか
- linux系の場合は/home/ユーザ名 と慣習で(?)なっていることが多いと思います。マックは違ったはずです
-
コンピュータの一番上とはなにを指しますか?
- cd .. をし続けてそれ以上移動できなくなったところです。Cドライブの一番上、みたいな感じです
-
Tabを押しても補完されないです。
- ちょっとわからないですが、いろいろ閉じて開きなおしたりしてみてください
-
ディレクトリとはフォルダのことですか
- そうです
-
Cloud Shell Editorに接続できない
- 事例1:何回リロードしてもエディタに接続できません
- 事例2:Cloud Shell エディタを初期化しています が3分以上続いていて操作できなくなってしまいました。どうしたらよいでしょうか
- 事例3:サードパーティCookieが無効であるため、コートエディタを読み込むことができません、と出てきてしまうのですが、どうすればいいでしょうか
- 解決策1:サードパーティCookieが無効である>>「サイト越えトラッキングを防ぐ」をオフにすることで解消できました!
- 解決策2:>サードパーティCookieが無効であるため、コートエディタを読み込むことができません、と出てきてしまうのですが、どうすればいいでしょうか これなんですが、新しいウィンドウを開くを押したら同じような画面に飛べました。
- 解決策3:同様の問題が発生していましたが,google アカウントを大学のから個人のに変えたらできました
- 上記検証してくれたみなさん、ありがとうございます!(松井)
-
今の解説はwindowsの場合ですか?macの場合少し異なるということはあるのでしょうか?私の場合、ターミナルの開き方が今の解説の方法だと難しそうです。
- 今日の解説はGoogle Cloud Shell Editor(ブラウザ)向けです
-
Linux環境で思い出したのですが、EEICの学科PC(UbuntuとWinのデュアルブートになっているもの)って僕たちも使えるのでしょうか?可能なら借りておいた方が楽でしょうか?
- 学科PCは3年からが基本だと思います。今はまだ借りないでも大丈夫なはずです。
-
本郷にいる大学院生ですが、次回以後対面になるんでしたら、授業の録画はあるのでしょうか?
- 録画はないです。ただ出席もないので、単位をとるには宿題を出してくれれば大丈夫です。
-
Cの環境構築について質問がるのですが,Linux入れるんですか?winとmacそれぞれどちらの方がやりやすいとかありますか?
- 今日はブラウザからやります。来週以降はwinでもmacでもブラウザでも大丈夫です。
-
プログラミング基礎演習をとっていなくてもこの授業についていけますか
- はい。ついていけます
-
Cってcppって何が違うんですが?授業だとcppじゃなくてC使うんですか?
- cppのほうが機能が多いというのがショートアンサーです。Cがまず基本としてあるので、まずCを教えます。
Week2¶
-
グローバル関数よりもローカル関数が優先されるなら、「変数のスコープ」の2つ目のコードの中で、f()を動かしたらaが4になってしまうように感じたのですが...
- ちょっと説明が不十分でしたね。「グローバル変数aがある状態で、関数の内側で新たに int a = 3のように同じ変数名の変数を作った場合には、ローカル版が優先される」ということです ここの2つ目のコードの例では、同名変数を作っていません
-
関数の引数に配列を使うことができますか。その場合も値渡しの形になりますか。
- これがC言語全体を通して重要なテーマになり、week3か4で詳しく述べます。結論としては「関数の引数に配列を渡すことは出来ますが、それはポインタ経由で渡すという仕組みになります。」「配列そのものを値渡しすることはできません」
-
int a[] = {}; for(int i=0; i<8; i++) { printf("%d: %d\n",i, a[i]); }のようにして、intの部分を他の型にして出力を見ていたのですが、intとint32_tや、unsigned charとuint8_tなどで挙動が違いました。 型の説明を見る限り、同じ型であるように思っていたのですが、一部仕様が違うのでしょうか?- これは「初期化をしていない配列の内容を表示する」というのを、様々な型の変数で行ったということですかね?これに関しては未定義なので未定義としか言えないです(未定義の場合の動作はその名の通り未定義です)
-
三次元配列の値を指定するときはforループを使用するのですか?
- 配列初期化表記を再度繰り返すことで出来ますので是非やってみてください
-
case文でcase 1: case2:のように、「;」ではなく「:」を使うのに理由はあるのでしょうか?
- c言語において「;」と「:」は全く意味が違う記号です。「;」は式の直後において文を形成しますが、switchでcaseの直後におかれる「:」はそういう意味はありません。
-
cloud shellでも#include
が必要ですか - なくてもコンパイルして実行できますが、警告が出るようです
-
vscodeのターミナルでtouchやgccを実行すると操作可能なプログラムの名前として認識されません と出ます
- macで行ってください。wslではないwindows環境はサポートしていません。
Week3¶
-
ファイルからの入出力について、入力元のファイルと出力後のファイルを同じものにして複写スラッシュプログラムを施した場合、そのファイルの中身が全消去されました。これはなぜですか?
- 任意のプログラム(例えば
./a.out)に対し、リダイレクトで入力と出力を同じもの(例えばhoge.txt)に設定した場合(./a.out <hoge.txt >hoge.txt)、まず最初に「出力先がhoge.txt」という時点で、hoge.txtの中身がクリアされまっさらなものになるそうです。その後、./a.outの実行、hoge.txtへの書き込み、が行われるとのことです。すなわち、まっさらなファイルが入力されて./a.outが実行されます。複写スラッシュプログラムは入力が無い場合は出力がないので、最終的にhoge.txtはまっさらになります。参考
- 任意のプログラム(例えば
-
getcharの出力の型はなぜchar型ではなくint型なのかがわかりません。受け取るものがchar型と-1(EOF)だけならchar型を出力する関数でも十分だと思いました。
- これは確かに不思議なところなのですが、c言語でこのように文字をキャッチする場面ではよくintが使われるようです。文字(char)は単なる整数なので、int(より広い範囲を表せる、単なる整数)を使うことによるデメリットはないです。
-
複写プログラムでは、文字を入力しenterを押した時点でEOFが返されているのに、単語数をカウントするプログラムでは、なぜEnterを押しただけではEOFが返されないのかがわかりません
- 複写プログラムでも、エンターするだけだとEOFが返されていません(なので終了しません)
-
int getchar()のバッファがよくわかりません。 たとえば、資料の複写プログラムの次のプログラム(You entered new line\n のもの)にキーボードで abcd^D // ^Dはctrl+Dの意 と入力したとします。このとき、int c = getchar()は入力を前から一文字ずつ取っていくとするならば、You entered a, You entered (中略) d というふうにdまで出力した後、c は^Dを入力として受け取りませんか? そしてこのときwhile文から抜け出してプログラムが終わると自分は考えたのですが、プログラムが終了しないのはなぜですか
- 直後のコラムを参照してみてください。バッファに何かたまっている場合にctrl+Dをすると、EOFを送るのではなく「バッファを流し込むだけ」という特殊動作になります
-
int main() { printf("%c\n",putchar(97)); }として「a」を出力させようと思ったのですが、「aa」が出てしまいます。何が間違っているのでしょうか。- まずputcharを発動した時点で、標準出力(端末)に「a」が表示されます。その後、putcharはa自身をreturnするので、それがprintf中の%cにはいって、printfが「a」を出力します。なのでaaとなります。printf("===%c===\n", putchar(97))とかとすると仕組みがわかると思います
-
a.outにsample.datをリダイレクトしようとすると「演算子'<'は今後の使用のために予約されています」と表示されます。どうリダイレクトすればよいでしょうか
- これは何か間違えたことをしている気がします
-
getcharとprintfがとても似ていると感じたのですが、似たものと認識していて良いのでしょうか。
- putcharですかね。画面に何か表示するという意味では似ています。c言語にはこういう入出力関数がたくさんあり、printfはとても高機能なもので、putcharはとてもローレベルなものです
-
標準入力自体がgetcharの引数と考えることはできないのですか
- いま学んでいる範囲で、標準入力は引数として与えられるようなものではないです
-
getcharの引数はなぜvoidなのですか
- getcharは単に標準入力がから1字とってくるだけなので、引数で指定するものがないからです
-
日本語の文字列だとstrlenがうまく動きません。
- 日本語だとうまくいかないと思います
-
%cと%sはどう違いますか。
- %cは「文字1つ」の表示用です。文字or数字そのものが入ります。%sは「文字列(任意個の文字+ヌル文字)」の表示用です。アドレスが入ります。
-
一文字の場合、数字に対応する文字をprintfできましたが、配列を使って同じように文字列を数字でprintfしようとするとabcbcみたいな関係ない文字しか出力されません。そういうものですか。
- 文字列に対してfor文を回して一文字ずつprintfで%dで出力すれば当然数字が出ます。もし文字列そのものに対して一発でprintfで数字の列をだそうとしているなら、それはおそらく正しくない処理をしています
-
char n = 6; char s[n] = "hello"; printf("%s\n", s); としたらエラーになったのですが何故ですか?
- これは「可変長配列に対して初期化記法は使えない」と言うのが理由になります。week6でやるのですが、今知りたい人は去年の以下をどうぞ https://eeic-software1.github.io/2024/week6/#_4
-
試しにint arr[3] = {1, 2, 3}; printf("%d\n", sum_array(arr, 4)); をやってみたら7と出てきたのですが、なぜですか
- sum_array内のforループが境界外にアクセスして未定義動作になっています
-
char s2[10]; strcpy(s2, "hello");のような初期化の仕方はできないと言っていましたが#include
すれば許されるのでしょうか? - 「s2を作ったあとにs2 = {...}はできないが、strcpyを使えばs2を作ったあとでもまとめて値を代入できるのか?」という意味であれば、そうです。
-
ECCSのパソコンで日本語入力できないときは、一回設定のキーボードから日本語入力を削除してもう一度追加すると大体戻るようです
- ありがとうございます!!!!
-
charは8bitなのにASCIIは0から127までで半分しか使わないのですか
- 負の部分は無いようです
-
関数のプロトタイプ宣言で配列を引数に書く時はどう書きますか?
- void hoge(int v[]) のように書けます
-
/0は一見に文字に見えますが、特例でchar1つで表せるということですか?
- そのようなイメージです。\0以外にも、\tや\nも同様です
Week4¶
-
クイズにおいて、試しにstr1の長さをstr2よりも短くした場合でも動作しましたがこれは未定義の動作ですか
- 未定義になります(どうしてそうなるか是非考えてみてください。いろいろやっていると変な場面を見れると思います)
-
strlen3のコードで、
while(*s)と条件式を書いていましたが、たとえば"hog0e"のような途中に0が含まれる文字列にstrlen3を適用しても返り値が正しい5になるのがわかりません。 途中で*s = 0となり、これは終了条件ではありませんか- これは是非なぜそうなのか考えてみて下さい。ヒントは、文字列中における'0'とは一体何なのか調査してみるといいです
-
char *pmsg: char型ポインタを1個だけ確保。プログラムのどこかで文字列リテラル"abcd"が確保される。 >このどこかというのがイメージが湧きません。- 読み込みしかできない領域(リテラルプール)に保存されるようです。アドレスを見てみると他の変数のアドレスと大きく違うことになっていると思います
-
whileやforの終了条件は、それが0か0じゃないかを判定しており、0だったら終了するという動作をしている という認識で正しいですか
- そうです。week2を復習 https://eeic-software1.github.io/2025/week2/#for してもらえればよいのですが、終了条件のところが偽であればループが終了します。
-
macOSではnilではなく0x0とでました
- ほんとですね!ウェブページを更新しておきました。
-
#defineを用いるときは型を明示しなくてよいのでしょうか#defineは型がどうこうという話以前に発動するるものになっていて、「ソースコード中に"N"という表記が出てきたらそれを"5"に置き換える」という事前処理になります
-
関数のvoidってどういう型ですか
- voidは普通の型ではなく、「型がない」ということを示す型です。void aのようにしてvoid型の変数というものを作ることはできません。一方、「
void *」(void型のポインタ)というものは「なんにでも変換できるもの」として使うことが出来ます(講義で触れます)
- voidは普通の型ではなく、「型がない」ということを示す型です。void aのようにしてvoid型の変数というものを作ることはできません。一方、「
-
先ほどのクイズの
*&aに関して質問です。&aはポインタではなくただのアドレスなので, 「ポインタには、*をつけると、指している変数の値にアクセスできるという特殊能力があります」という説明からすると,&aでその特殊能力が使えるのが不思議なのですが, どう理解したら良いでしょうか- これは鋭い指摘なのですが、実は「ポインタの特殊能力」というよりは「ポインタに入るもの=アドレスとして表現されるもの」の特殊能力というほうが正しいです。ポインタが一切登場しない場面でも実は使えます(例を見せます)
-
ポインタに直接アドレス(0x7f…)を入力してやるとエラーになってしまいました。事前に変数などで宣言されていないと使えないのでしょうか。
- ポインタに直接アドレスを書いて代入するのは普通にやろうとしても出来ないです
-
ポインタを使って、特に変数を宣言していない適当なアドレスに値を代入したり、値を変更したりできますか。
- これはやっちゃダメです(未定義動作になると思います)
-
後置の場合は
(*p)++;のようにかっこが必要と書かれていますが、かっこを付けずに出力してみるとa: 11, *p: 1094453744となりました。(かっこを付けた場合はともに12と出力される)これは何が起きているのでしょうか。- 「
*」より「後置の++」のほうが優先順位が高いので、*(p++)ということになります。ここではポインタpは変数一つを指しているので、そのポインタpに++を行うと変なところを指してしまい、そしてその変なアドレスの内容を「*」で無理やり表示しているのでおかしなことになります
- 「
Week5¶
-
hokuriku1[0]はポインタなので文字列を表示するには*(hokuriku1[0])としなければならないように感じるのですがなぜ*をつけないのですかhokuriku1[0] = s1だったことを思い出しましょう。なので、printf("%s\n", s1)で文字列表示できることを考えると、printf("%s\n", hokuriku1[0])で当然文字列表示できます。*(hokuriku1[0])というものは、*sというものに対応し、変になります(%sが受け取るものはアドレスです)
-
find_largest関数で
*max=a[0]をmax=&a[0]としてはダメな理由はなんですか。- その場合max(図中のfind_largst側の青いボックス)の中身を変更しろという意味になり、違う操作になります。main側に影響を及ぼさなくなります(右側の青いボックスを変更しているだけなので)。具体的に、maxがarrの先頭アドレスを指す用になります
-
クイズに関して、
int main() { char animal[] = "dog"; char **p; *p = animal; printf("%s\n", p[0]); // dog }とやるとSegmentation fault (core dumped)が出ました。なぜでしょうか。- 「pに対する代入」が行われていないので、*pをすると変になりますね。ポインタを作ったときはまず何かを代入しなくてはいけません。
-
授業ありがとうございます!授業に直接関係ないのですが、説明の図がわかりやすくて毎回とても勉強になります。そのような図形を作成するために、どのようなソフト/ウェブサイトをお使いになったか伺いたいです。
- 図は全部パワポです。
Week6¶
-
「構造体とポインタ」のクイズでr.pt1は左下、r.pt2は右上ではないですか?
- これは軸の取り方について、yは下向きになっています。行列を考えるときに添え字
a_{1, 1}は左上を示すということに対応します(計算機で2次元情報を扱うときはそうすることが結構あります)
- これは軸の取り方について、yは下向きになっています。行列を考えるときに添え字
-
Rect r = {.pt1 = {.x = 10, .y = 30},...の部分が初期化以外の部分の初期化構文に思えてしまうのですがなにが違うのでしょうか- そこはどの部分も初期化構文になっていて、rectの初期化構文の中でptの初期化構文を使っています。
Week7¶
- 自由課題したら加点ありますか?
- week7_2をやらないよりはやるほうが加点はありますが、「やらないと単位が来ない」というような差にはしない予定です。
- そもそもUsernameやPasswordを打つよう指示されないまま反映されたんですけど、どういうことですか?
- これまでの認証の状況に応じては、パスワードが入力しなくても通る状況になっているかもしれないです
- cloneの際に
Username for 'https://github.com':でユーザーネームを打ってエンターした後Password for 'https://hoge528@github.com':は出てきますが、何も打つこともできず、コピペもできなくなってしまいます。- そこはパスワード入力画面なので、文字を打っても表示されない状態になっています。なので、コピペしたときに、コピペできているけど見えない、という状況の可能性があります
- githubに飛んでauthorizeしてからvscodeにリダイレクトしたのでvscode上でパスワードなどを入力しなかったのですがこの手順でも大丈夫でしょうか
- cloneとかが出来ていれば、とりあえず大丈夫だと思います
- このトークンというのは、情報教育棟のPCと自分のPC両方で作業したい場合はそれぞれで別のが必要ですか
- いえ、1つで大丈夫です。トークンはGitHubサービス全体で共通して使えるので、実行するのがどのPCか、というのは関係ないです。