❤恋するコンピュータサイエンス❤

コンピュータサイエンス、3DCGをもっと楽しく、もっと本質的に!c言語、c++の記事中心です

C言語の文字列とC++の文字列の違いを説明せよ

Q
.C言語の文字列とC++の文字列の違いを説明せよ


C言語では文字列をポインタとして渡すことが一般的です。C言語にはC++のような組み込みの文字列データ型は存在せず、代わりに文字の配列として表現されます。文字列はヌル文字('\0')で終端された文字の配列として扱われます。文字列の先頭文字へのポインタを渡すことで、ヌル文字が出現するまで文字列全体にアクセスすることができます。

C言語の文字列は配列であるため、長さに関する情報は明示的に持ちません。文字列の長さはヌル文字が出現するまでの文字数で決まります。C言語の文字列を操作する関数は、しばしばこのヌル文字を終了条件として利用します。

そのため、C言語で文字列を渡す際には、文字列の先頭文字へのポインタとして渡すことが一般的です。これにより、関数はヌル文字に遭遇するまで文字列の各文字にアクセスできます。文字列の長さに柔軟性が持たせられる一方で、文字列の終端以降のメモリにアクセスしないように正しくヌル文字を配置する必要があります。


コンストラクタを使うことでchar*型の文字列からstring型に変換することができます。コンストラクタとは変数を宣言する際に呼ばれる関数のことです。
以下のように宣言することができます

42Tokyo Piscine  2日目(ピシン)【テーマを探り当てる】

42の課題はテーマがあり、そのテーマを探り充てることが初心者プログラマーにとっての最初の関門である。テーマを探り当てるためには、その前提知識を理解することから始まる 。 プログラマー経験のある生徒なら、ははーんこれはこの意図をもって作られた課題だなと、即座に理解する事ができるが、残念ながら未経験者にとって、課題文を読んでも最初は??でしかないのだ。自分の理解力の乏しさに気持ちが折れそうになるが、動物のように知識を貪る以外に前進する道はないのだ。

そもそも何かを理解するとは既にある頭の中の知識とネットワークを作る事だ。その意味でいうとネットワークを構築する為の前提知識が無い場合は必死にネットや本を漁って、知識を定着させなければならないのだ。

 

シェルとは何か?

Q.

シェルとは何か?

 

A.

シェルとはシステムコールの為の関数です。

 

システムコールとはカーネルの外の階層に位置し、カーネルを操作するためのインターフェイスシステムコールの一般的な関数ライブラリはC言語で定義されている。

情報を出力したり、入力したりするのは、コンピュータ全体に関わることなので、システムコールと呼ばれ、シェルに内包されている関数である。

バイスやファイル、プロセスなどが関与する場合は、カーネルとのやりとりが必要になります。

何故シェルでカーネルを操作するのかというとOSのカーネルを直接操作するのは困難だからだ
実はそれらの標準ライブラリ関数は, 内部でwrite( )やopen( )といったシステムコール
利用してOSのカーネルとやりとりを行っています. これらは, プログラミング言語における
関数と同じく, 引数を与えたり戻り値を取得したりして利用します. つまり, システムコールAPI)は外見上, 関数としてプログラムのなかで扱うわけです. 
システムコールを使ったことがない方におさえておいてもらいたいのは,
システムコールの実体は関数」ということです. システムコールがハードウェアの挙動を隠蔽し, 抽象化する(関数としてブラックボックス化する)ことによって, プログラマはハードウェアの物理特性を意識することなく(すなわち, 通常の関数を利用する感覚で),
バイスからの入出力処理を行うことが可能となるのです.

42 Tokyo Piscine(ピシン)17日目【習うより慣れろ】

Piscine(ピシン)も2週間程過ぎた17日目、自分のプログラムの勉強法に致命的な欠陥を見つけてしまった。学生時代数学が得意だったこともあり、一行一行理解して数学の定理を証明するようにコードを書いていたが、この方法だと一行書くのに人より何倍も時間がかかってしまう。

プログラミングは、数学のような論理的な思考力やアルゴリズムの設計が必要な面があるが、同時にプログラミング言語自体の独特な文法の習得が必要だ。この文法の理解には、理解するだけでなく慣れる姿勢も重要です。特に初心者の場合は、言語習得のように習うより、慣れろことが言えるとおもう。

例えば、一番初めに英語を習ったとき、単語の断片をつなぎ合わせてコミュケーションをネイティブと積極的にとる方が、本と格闘しているより、上達がはやい
言語を習得する際に有効な方法は新しく覚えた単語を使ってアウトプットするこだ。

つまり、初期のプログラムの習得は新しい言語を理解するようにコード自体を理解すると同時に慣れる事が重要だと気付かされる。

その為に小さい テストケースを作って  コードを動かしてみてして みて 頭が最適化されていき、後で意味がわかるという勉強方が有効だ。

chat GPT の衝撃

Q

将棋や碁を極めたいと思うか?

 

A.

私は思わない。なぜならAIにはかなわないからだ。

この問いは、プログラミング学習においてAIとのかかわり方への踏み絵だとおもう。

今まで推理小説を解くようにプログラミングをしていたのだが、

Chat GPTの登場でプログラミングの学習の仕方が変わってしまった。

AIとの向き合い方が、人間が学習するという事の再定義に繋がってくるのかもしない

 

class と struct の違い

Q.
class と struct の違いは何か?

A.
構造体structはデータのまとまりに名前を付けただけ。

classはコンストラクタを実装できる。

 

class と struct は、C++において構造体を定義するためのキーワードであり、大きな違いはありません。両者の機能はほぼ同じで、メンバ変数やメンバ関数を定義することができます。

ただし、一般的には以下のような使い分けがされます。

classカプセル化情報隠蔽など、オブジェクト指向プログラミングの機能を使用する場合に用いられます。
structC言語の構造体を使ったプログラムから移行した場合や、メンバが public であるような単純なデータ構造を定義する場合に用いられます。


具体的な違いとしては、class のデフォルトのアクセス修飾子は private であるのに対して、struct のデフォルトのアクセス修飾子は public である点があります。しかし、アクセス修飾子は明示的に指定することが推奨されており、実際のコードでの使用頻度はそれほど高くありません。

例えば、以下のように class と struct を使った場合、どちらの場合でも同じように動作します。

 

凡人: 「class」と「struct」ってどう違うの?

恋するコンピュータサイエンス: いい質問だね!C++では、これらは両方とも構造体を定義するためのキーワードなんだ。基本的には機能が同じで、メンバ変数やメンバ関数を持たせることができるよ。

凡人: でもなんで2つあるの?

恋するコンピュータサイエンス: 「class」はカプセル化情報隠蔽など、オブジェクト指向プログラミングの機能を使う時に使われることが多いんだ。一方、「struct」はC言語の構造体を使ったプログラムから移行したり、メンバがpublicである単純なデータ構造を作る時に使うことが多いよ。

凡人: 他に違いはあるの?

恋するコンピュータサイエンス: 実はもう一つ大きな違いがあって、それはデフォルトのアクセス修飾子なんだ。classはデフォルトでprivateだけど、structpublicなんだよ。

凡人: えっ、それってどういうこと?

恋するコンピュータサイエンス: つまり、classで定義されたメンバはデフォルトで外部からアクセスできないけど、structではデフォルトで外部からアクセスできるということ。ただ、アクセス修飾子は明示的に指定することが推奨されているから、実際のコードではそんなに違いは感じないことが多いんだ。


Copy code
class MyClass {
public:
    int x;
    void func() { }
};

struct MyStruct {
    int x;
    void func() { }
};

int main() {
    MyClass c;
    c.x = 1;
    c.func();

    MyStruct s;
    s.x = 2;
    s.func();

    return 0;
}