アカウント名:
パスワード:
本質的に問題を生んでいるものだけではなく、たんに書いた人が使い慣れている他の言語と違う挙動をするだけ、というものが結構混ざっているような。
私にわかる分だけでも。
>Pythonでインデントレベルがブロックを示すこと
Python全否定されているんだが。CoffeeScriptはいいのか?
>Cの配列インデックスがポインターの算術演算のような動作をすること
他にどうやって配列の中身を表せと。1[a]と書けるとかの話をしている?
>Rubyで「0」がTRUEと評価されること
「0」がfalse出なければいけない理由がC出そうだという以外思いつかないのだが、何かあるのだろうが。
>JavaScriptで勝手に挿入されるセミコロン
Rubyでもそれはなかったっけ?
Cの配列インデックスってsyntax sugarと思っていなくて、本当に配列というものが存在しているかのように誤解しているんじゃなかろうか。関数の仮引数を配列形の書き方をしている人をみるとそういう気がする。
void foo(char *a){ char b[3];}
の、bは「本当に存在する配列」と違いますか?
スタックに積まれる物は、aは、「何かのアドレス」が1個だけ。bは、「b[0]」、「b[1]」、「b[2]」に相当する3つのcharになりますよ。
翻訳後の機械語の動作としても、別物になり、
x = *a; // 「スタックポインタ+コンパイル時に決まるaのオフセット(定数)」を計算→その番地の値を読み込む→その番地の値を読み込んで、xに代入x = *b; // 「スタックポインタ+コンパイル時に決まるbのオフセット(定数)」を計算→その番地の値を読み込んで、xに代入// a[0]、b[0]と書いても同様
そんなことをいったら、a だってインライン展開の具合次第でなくなることはあるでしょう。あんまり本質的な議論だとは思えません。まさに、C Languageが「未定義」という必殺技を繰り出す最大の理由でしょう。C99とかではかなり論調が変わってきたのも事実ですが・・・。
いえ、aは、a++できますが、bは、b++できません。配列とポインタの本質的な違いです。
char *a = "abc";char b[]="abc";
も本質的に違い、どちらにも異なる利点・欠点があります。
未定義動作と話が繋がるのかは想像できませんでしたので説明いただけると助かります。
私が、言ったのは、
> bがスタック上のどこにあるのかをコンパイラは把握出来るので、出力する機械語にその値を直接埋め込んでしまえますから、> 実行時に、「変数b」に該当するような値を覚えておく必要、メモリは不要になります。
という部分に対して、bが変数として保存される必要がないという部分に対してです。話が分かりにくくて済みません。
一方で、
> いえ、aは、a++できますが、bは、b++できません。配列とポインタの本質的な違いです。
と言われると、C++プログラマとしては、
char const * const a = "abc";
なんていうヒネクレタ事も言いたくなる部分ではあります。
個人的には、sizeofの挙動以外、大した差ではないと思っていますが。
いや、まじめに「配列とポインタには本質的な違いがある」という人に、このaはポインタなのか配列なのかを伺いたい。形式的にはポインタだしsizeof(a)もポインタのサイズを返すが、性質としては配列というわけでしょう?
え、まさか配列とポインタの違いも分からないの?
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
一つのことを行い、またそれをうまくやるプログラムを書け -- Malcolm Douglas McIlroy
とりとめがないな (スコア:1)
本質的に問題を生んでいるものだけではなく、
たんに書いた人が使い慣れている他の言語と違う挙動をするだけ、
というものが結構混ざっているような。
私にわかる分だけでも。
>Pythonでインデントレベルがブロックを示すこと
Python全否定されているんだが。CoffeeScriptはいいのか?
>Cの配列インデックスがポインターの算術演算のような動作をすること
他にどうやって配列の中身を表せと。
1[a]と書けるとかの話をしている?
>Rubyで「0」がTRUEと評価されること
「0」がfalse出なければいけない理由がC出そうだという以外思いつかないのだが、何かあるのだろうが。
>JavaScriptで勝手に挿入されるセミコロン
Rubyでもそれはなかったっけ?
Re: (スコア:0)
>Cの配列インデックスがポインターの算術演算のような動作をすること
他にどうやって配列の中身を表せと。
1[a]と書けるとかの話をしている?
Cの配列インデックスってsyntax sugarと思っていなくて、本当に配列というものが存在しているかのように誤解しているんじゃなかろうか。関数の仮引数を配列形の書き方をしている人をみるとそういう気がする。
Re: (スコア:0)
void foo(char *a){
char b[3];
}
の、bは「本当に存在する配列」と違いますか?
スタックに積まれる物は、aは、「何かのアドレス」が1個だけ。bは、「b[0]」、「b[1]」、「b[2]」に相当する3つのcharになりますよ。
翻訳後の機械語の動作としても、別物になり、
x = *a; // 「スタックポインタ+コンパイル時に決まるaのオフセット(定数)」を計算→その番地の値を読み込む→その番地の値を読み込んで、xに代入
x = *b; // 「スタックポインタ+コンパイル時に決まるbのオフセット(定数)」を計算→その番地の値を読み込んで、xに代入
// a[0]、b[0]と書いても同様
Re: (スコア:0)
そんなことをいったら、a だってインライン展開の具合次第でなくなることはあるでしょう。
あんまり本質的な議論だとは思えません。
まさに、C Languageが「未定義」という必殺技を繰り出す最大の理由でしょう。
C99とかではかなり論調が変わってきたのも事実ですが・・・。
Re: (スコア:0)
いえ、aは、a++できますが、bは、b++できません。配列とポインタの本質的な違いです。
char *a = "abc";
char b[]="abc";
も本質的に違い、どちらにも異なる利点・欠点があります。
未定義動作と話が繋がるのかは想像できませんでしたので説明いただけると助かります。
Re: (スコア:0)
私が、言ったのは、
> bがスタック上のどこにあるのかをコンパイラは把握出来るので、出力する機械語にその値を直接埋め込んでしまえますから、
> 実行時に、「変数b」に該当するような値を覚えておく必要、メモリは不要になります。
という部分に対して、bが変数として保存される必要がないという部分に対してです。
話が分かりにくくて済みません。
一方で、
> いえ、aは、a++できますが、bは、b++できません。配列とポインタの本質的な違いです。
と言われると、C++プログラマとしては、
char const * const a = "abc";
なんていうヒネクレタ事も言いたくなる部分ではあります。
個人的には、sizeofの挙動以外、大した差ではないと思っていますが。
Re:とりとめがないな (スコア:0)
char const * const a = "abc";
なんていうヒネクレタ事も言いたくなる部分ではあります。
いや、まじめに「配列とポインタには本質的な違いがある」という人に、このaはポインタなのか配列なのかを伺いたい。
形式的にはポインタだしsizeof(a)もポインタのサイズを返すが、性質としては配列というわけでしょう?
Re: (スコア:0)
え、まさか配列とポインタの違いも分からないの?
Re: (スコア:0)
どうして混乱できるのでしょうか。