検索結果 27 件

by sys
14年前
フォーラム: C言語何でも質問掲示板
トピック: 副作用、副作用完了点について
返信数: 8
閲覧数: 7505

Re: 副作用、副作用完了点について

代入演算子の第2オペランドは (++I) の結果の値であって、i の値の読み取りは行いません。 ++++i は ++(++i) で、(++i) の結果が左辺値ではないので、最初の ++ はオペランドの制約に反する。 なるほど、よくわかりました。 これでだいたいの疑問が解消されました。 最初、a[i++] = i;の未定義の理由が 「左辺値式では、格納される値を決定するため以外の目的で i を読み取っているから」 と解説しているサイトがあり、右辺値式のiは関係ないように読み取れる気がしてしまい、 「変更前の値の読取りは、格納される値を決定するためだけに行われなければならない。」 と定義に書かれ...
by sys
14年前
フォーラム: C言語何でも質問掲示板
トピック: 副作用、副作用完了点について
返信数: 8
閲覧数: 7505

Re: 副作用、副作用完了点について

めるぽん さんが書きました:蛇足かもしれないですが、恐らく今年か来年あたりに策定される新しい C++ の仕様では、sequence point という用語は無くなり、代わりに sequenced-before という定義で、より厳格なモデルが規定されることになります。
http://d.hatena.ne.jp/Cryolite/20101228#p1
C++の定義は今回で初めて見ましたが、Cより複雑そうな印象を受けました。
参照サイト見ました。今後の参考にさせて頂きます。
ありがとうございます。
by sys
14年前
フォーラム: C言語何でも質問掲示板
トピック: 副作用、副作用完了点について
返信数: 8
閲覧数: 7505

Re: 副作用、副作用完了点について

かずまさん宛 完結式は 6.8 で定義されていましたか。ありがとうございます。 再度の確認になりますが、、、 (1) a = ++i; ok オブジェクト i の読み取りは 1回、変更も 1回だから。 (2) a = i++; ok オブジェクト i の読み取りは 1回、変更も 1回だから。 (3) a = ++i+1; 未定義。 オブジェクト i が前置++演算子によって変更されるが、その i の読み取りは、前置++演算子以外に + 演算 によっても行われるから。 (4) a = i+++1; 未定義。オブジェクト i が後置++演算子によって変更されるが、その i の読み取りは、後置++演...
by sys
14年前
フォーラム: C言語何でも質問掲示板
トピック: 副作用、副作用完了点について
返信数: 8
閲覧数: 7505

副作用、副作用完了点について

副作用と副作用完了点についての質問です。 (さきほど一度投稿したのですが、あまりにも間違いが多かったのでコメント頂く前に削除しました。) まず、C++のJIS X3014:2003では、 副作用完了点(sequence point) 以前に行った評価に伴うすべての副作用が完了し、それ以後に行われる評価に伴うすべての副作用がまだ発生しない、実行列中の地点。副作用完了点には以下のようなものがある。 ・完結式の直後 ・関数の実引数の評価直後 ・関数の返却値のコピー直後 ・論理和演算子(||)または論理積演算子(&&)の左辺の評価直後 ・コンマ演算子の左辺の評価直後 と定義されているみたいですが、C言...
by sys
14年前
フォーラム: C言語何でも質問掲示板
トピック: 配列型に対する&演算子について
返信数: 14
閲覧数: 5661

Re: 配列型に対する&演算子について

ISLe さんが書きました: 書籍や雑誌は知らないのですが、そのサイト(フィンローダ氏の初級C言語Q&Aですよね)のインデックスページにcomp.lang.c FAQのリンクがあります。
"C FAQ"とか"C++ FAQ"で検索するとその手のサイトがヒットしますよ。
はい、そのサイトです。他にも疑問に思っていたことも載っていて感動しました。

やっぱり内容的に書籍での需要はなそうですよね…。検索で地道に情報収集したいと思います。
ありがとうございました。
by sys
14年前
フォーラム: C言語何でも質問掲示板
トピック: 配列型に対する&演算子について
返信数: 14
閲覧数: 5661

Re: 配列型に対する&演算子について

arrayがどのように評価されるかは、arrayがどこに記述されているかで異なるので(2)は誤りです。 特にsizeofやtypeidのオペランドに演算子をともなわない配列名が現れたときは例外扱いになりますから。 基本的なことを見落としてました…。何回も話に出していた 6.3.2.1 の3つの例外をのぞく配列型の暗黙の型変換ですね…。 式が評価されない、される、そもそも式ってなんだ?アクセス?などなどいろいろ考えていたらこんがらがってしまいました。 評価した結果がどんな型になるかきちんと定義されています。 評価した結果がどんな型になるかきちんと定義されているので、評価しなくても結果がどんな型...
by sys
14年前
フォーラム: C言語何でも質問掲示板
トピック: 配列型に対する&演算子について
返信数: 14
閲覧数: 5661

Re: 配列型に対する&演算子について

かずまさん宛 typeid().name() について、よくわかりました。 私の理解が乏しすぎました…。 丁寧な解説、ありがとうございます。 sizeof(&array) についてわからない部分があります。 JIS X3010 6.5.3.4 sizeof演算子 オペランドの型が可変長配列型である場合、オペランドを評価する。そうでない場合、オペランドは評価せず、その結果は、整数定数とする。 と定義。 sizeof(&array)を考えると、 (1)式を評価しない「array」の型は char[2][3]である。 (2)式を評価しないということは「&array」も評価されない。 (3)式を評価し...
by sys
14年前
フォーラム: C言語何でも質問掲示板
トピック: 配列の先頭要素を指すポインタ自体のアドレスについて
返信数: 24
閲覧数: 10121

Re: 配列の先頭要素を指すポインタ自体のアドレスについて

「C言語 ポインタ完全制覇」は購入しました。
これを読んで配列やポインタに対して格段と理解出来るようになりました。
入門書としては最適だと思います。

ただそれでも、載ってないことなど学べば学ぶほど疑問が出てきて、、、
まだポインタ、配列から抜けだせません。
ここ数日、まだまだ配列への質問続きですが…ご教示して頂ければ幸いです。
by sys
14年前
フォーラム: C言語何でも質問掲示板
トピック: 配列型に対する&演算子について
返信数: 14
閲覧数: 5661

Re: 配列型に対する&演算子について

かずまさん、ISLeさん宛 なるほど。理解出来たかもしれません。 確認になってしまいますが、 (1) array 自体の型は「char[2][3]」 (2) array が式として書かれた場合評価され、その型は「char(*)[3]」となる。 (3) typeid(array).name は式として評価されない為、「char[2][3]」 ここまでの解釈はあっていますか? かずまさんへの質問です。 &*array を評価する場合、まず、array は上記の評価結果となる。 *array の評価結果は、値が array[0] すなわち "ab"。型は char [3]。 &*array の評価結...
by sys
14年前
フォーラム: C言語何でも質問掲示板
トピック: 配列型に対する&演算子について
返信数: 14
閲覧数: 5661

Re: 配列型に対する&演算子について

sizeofの定義に出てくる「オペランド」とは全ての演算子(オペランド)を指していないということなのでしょうか? 演算子(オペランド)とありますが、 演算子(+-*/etc...)はオペレータで、x + y - zのx, y, zなどをオペランドと呼ぶのですがどちらを指しているのでしょうか? あっ、、、失礼しました。大きな間違いです。 オペランド(operand) ... 演算項目、演算対象、演算の対象となる値や変数のこと オペレータ(operator) ... 演算子 ですね。...恥ずかしい間違いです。 ※原文の(オペランド)は削除しました。 sizeof演算子のオペランドは評価せず、は...
by sys
14年前
フォーラム: C言語何でも質問掲示板
トピック: 配列型に対する&演算子について
返信数: 14
閲覧数: 5661

Re: 配列型に対する&演算子について

(本文中とcode内の変数名の統一がされてなかったので訂正) typeidのオペランドは、sizeof演算子と同じく、評価対象式ではないのでポインタに型変換されません。 →JIS X3014:2003(ISO/IEC 14882:2003) 3.2 単一定義規則 2 JIS X3014 ・式は、次のいずれかの場合を除いて、評価対象式という。  ---式が、typeid演算子の演算対象となっており、多相クラス型の左辺値を表していない。 JIS X3010 6.5.3.4 sizeof演算子 オペランドの型が可変長配列型である場合、オペランドを評価する。そうでない場合、オペランドは評価せず、その結...
by sys
14年前
フォーラム: C言語何でも質問掲示板
トピック: 配列の先頭要素を指すポインタ自体のアドレスについて
返信数: 24
閲覧数: 10121

Re: 配列の先頭要素を指すポインタ自体のアドレスについて

やっぱり翻訳というのは難しい作業なのですね。
今回の件で定義を確認するときは、ISOの英語原文も注意深く確認するようになったので、
とても良い教訓になりました。
親切に導いて下さった方々に、ほんと感謝の気持ちでいっぱいです。

再度の補足ありがとうございます。
by sys
14年前
フォーラム: C言語何でも質問掲示板
トピック: 配列型に対する&演算子について
返信数: 14
閲覧数: 5661

配列型に対する&演算子について

char array[2][3] = { "ab", "cd" }; と宣言したとき、 「array」 の返す値は、配列の先頭要素のアドレスを返している。型は、char[2][3] 「&*array」 の返す値は、配列の先頭要素のアドレスを返している。型は、char(*)[3] ※型は typeid(array).name()、 typeid(&*array).name で確認。 JIS X3010 6.5.3.2 原文 [制約] 単項&演算子のオペランドは、関数指示子、[]演算子若しくは単項*演算子の結果、又は左辺値でなければならない。 左辺値の場合、ビットフィールドでもなく、registe...
by sys
14年前
フォーラム: C言語何でも質問掲示板
トピック: 配列の先頭要素を指すポインタ自体のアドレスについて
返信数: 24
閲覧数: 10121

Re: 配列の先頭要素を指すポインタ自体のアドレスについて

ご指摘等のコメントもなく私も納得できたので、ひとまず収束したいと思います。 皆さんのコメントのおかげで、配列型への理解が深まりました。 ありがとうございました。 まだ知らないことも多く、皆さんのように質問への回答コメントは難しいので、皆さんとmixC++への感謝と微力ながらの貢献として、 マイ日記に今回の質問で教えて頂いたことと、私なりに配列型を理解するのに必要な定義をまとめたものを投稿してみました。 http://dixq.net/forum/blog.php?u=688&b=1963 http://dixq.net/forum/blog.php?u=688&b=1964 配列、ポインタにつ...
by sys
14年前
フォーラム: C言語何でも質問掲示板
トピック: 配列の先頭要素を指すポインタ自体のアドレスについて
返信数: 24
閲覧数: 10121

Re: 配列の先頭要素を指すポインタ自体のアドレスについて

「変数」 「値」 「型」 これらをまとめて「ポインタ」とだけ理解していた点が おっしゃる通り混乱していた原因だと思いました。 6.3.2.1の記述をアレンジすれば 「特定の場合を除いて、配列名はその要素型へのポインタに型変換される。それは配列の先頭要素を指す。」 という感じになると思いますが。 要素型ってところがいまいち。 日本語に翻訳するのがなんとも難しい気がしますね…。 ただ、上記で私は納得出来ました。 配列を理解するには、当然と言えば当然ですがC99の添字演算子、配列宣言子の項目だけでなく、 ・配列型(array type)、ポインタ型(pointer type)は派生型(deriva...
by sys
14年前
フォーラム: C言語何でも質問掲示板
トピック: 配列の先頭要素を指すポインタ自体のアドレスについて
返信数: 24
閲覧数: 10121

Re: 配列の先頭要素を指すポインタ自体のアドレスについて

規格も含めてポインタという単語の周りはいろいろ省略されている気がします。 #include <stdio.h> void twice(int *n) { *n *= 2; } int main(void) { int i = 12; int *p = &i; twice(p); printf("%d\n", i); return 0; } intへのポインタpを宣言します。 iへのポインタでポインタpを初期化します。 関数twiceの引数はintへのポインタです。 違和感ありますか?ありませんか? (追記) 「整数i」は違和感ありますよね。 失礼しました。こちらについての返答が漏れてました。...
by sys
14年前
フォーラム: C言語何でも質問掲示板
トピック: 配列の先頭要素を指すポインタ自体のアドレスについて
返信数: 24
閲覧数: 10121

Re: 配列の先頭要素を指すポインタ自体のアドレスについて

なぜ、6.6 Constant expressions を省略するのですか? 失礼しました。省略したというよりは返答にも書いてある通り ざっとしか見てなかったからです、すいません。 6.6 から ・3 + 5 は、「整数定数と整数定数の加算の整数定数式(integer constant expression」 でしょうか? sysさんの質問は、「a + 5 が定数式でなければ何になるのでしょうか?」と言っているのと同じです。 私は、かずまさんの上記のコメントに対して仮にもし私だったら 「a + 5 は標準符号付き整数型と整数定数の加算の式」 と答えるだけで、 だから、「a + 5 が『定数式...
by sys
14年前
フォーラム: C言語何でも質問掲示板
トピック: 配列の先頭要素を指すポインタ自体のアドレスについて
返信数: 24
閲覧数: 10121

Re: 配列の先頭要素を指すポインタ自体のアドレスについて

配列の宣言で、ポインタが『生成される』ことはないので、どちらでもありません。 失礼しました、「生成」は自分なりの用語でした。 ISLeさんのコメントで気が付きました。いままで、 [C99 6.3.2.1] 式中の array は配列の先頭要素を指すポインタ(points to the initial element of the array object) と書いていましたが、 "pointer"ではなく"points"ですね。 JIS X3010 でも、 「配列オブジェクトの先頭の要素を指し(points)」 と翻訳してあり、けして、 「配列オブジェクトの先頭の要素へのポインタ(point...
by sys
14年前
フォーラム: C言語何でも質問掲示板
トピック: 配列の先頭要素を指すポインタ自体のアドレスについて
返信数: 24
閲覧数: 10121

Re: 配列の先頭要素を指すポインタ自体のアドレスについて

3 + 5 は式です。定数だけを含む式なので、これを定数式です a + 5 は式です。変数を含む式なので、これは定数式ではありません。 この例に対しては、int a;と宣言されているとして(intじゃなければ他の表現ですが、例に記載がないのであくまで仮で) ISO/IEC 9899:1999(以下C99) ・6.2.5 type 4段落 standard signed integer types ・6.4.4.1 Integer constants ・6.5 Expressions ・6.5.6 Additive operators の定義から、 3 + 5 は、「整数定数と整数定数の加算の...
by sys
14年前
フォーラム: C言語何でも質問掲示板
トピック: 配列の先頭要素を指すポインタ自体のアドレスについて
返信数: 24
閲覧数: 10121

Re: 配列の先頭要素を指すポインタ自体のアドレスについて

YuOさん、ご回答ありがとうございます。 上記No.7のコメント投稿後にYuOさんのコメントを拝見しました。 「アドレス」の定義というより、 「メモリ領域の特定の場所を指すアドレス値」 が、定義として存在するのかという疑問です。 メモリ上に確保されるのか、どのような場合にこれは作られるのか、などです。 ちなみに,「メモリ」があることは必須条件ではありません。 「ポインタ」にメモリは必須条件ではない、ということでしょうか? 単項&および単項*演算子のあたりで一応本文中に出てきたりしていた気はしますが……。 C99 6.5.3.2 Address and indirection operators...
by sys
14年前
フォーラム: C言語何でも質問掲示板
トピック: 配列の先頭要素を指すポインタ自体のアドレスについて
返信数: 24
閲覧数: 10121

Re: 配列の先頭要素を指すポインタ自体のアドレスについて

かずまさん、ご回答ありがとうございます。 array1の場合は[C99 6.6]の通りに理解出来るのですが、array2に関してがわかりません。 この例でのarray2はアドレス定数でなければ何になるのでしょうか? 自動変数としてメモリ上に確保されているけど、確認しようがないポインタということなのでしょうか? 出来ればそれが記述されてある規格での定義が知りたいです。 あと、 printf("%p\n", &array1[0]); // &array1[0] は、単項&演算子によりポインタとなるから、アドレス定数 で、単項*演算子([]演算子の暗黙の単項*演算子も)に対する単項&演算子は、C99...
by sys
14年前
フォーラム: C言語何でも質問掲示板
トピック: 配列の先頭要素を指すポインタ自体のアドレスについて
返信数: 24
閲覧数: 10121

Re: 配列の先頭要素を指すポインタ自体のアドレスについて

ISLeさん、ご回答ありがとうございます。

では、「配列の宣言で生成される、配列の先頭要素を指すポインタ」はどちらのポインタになりますか?
ISLe さんが書きました: メモリ領域の特定の場所を指すアドレス値
というのは、「メモリ領域に確保されない」メモリ領域の特定の場所を指すアドレス値
ということでしょうか?
これはISO_IEC9899に定義されていますか?処理系依存でしょうか?
by sys
14年前
フォーラム: C言語何でも質問掲示板
トピック: 配列の先頭要素を指すポインタ自体のアドレスについて
返信数: 24
閲覧数: 10121

配列の先頭要素を指すポインタ自体のアドレスについて

配列の宣言で生成される、配列の先頭要素を指すポインタ自体のアドレスについての質問です。(環境 Xcode 3.2.5 64bit) char array[3] = "ab"; と宣言したとき、 [C99 6.3.2.1]から式中の array は配列の先頭要素を指すポインタ(points to the initial element of the array object)となりますが、 このポインタ自体はメモリ上に確保されるのか、と疑問に思い調べていたのですがわかりません。 検索で探してみたら、 char a[5];」の宣言では、配列要素のchar型5個分のメモリ(5バイト)が実際に確保され...
by sys
14年前
フォーラム: C言語何でも質問掲示板
トピック: 配列の規格に沿った読み方について
返信数: 4
閲覧数: 2526

Re: 配列の規格に沿った読み方について

なるほど、やっとわかりました。

最初に配列への2重間接参照で勘違いしていたのは、C99 6.2.5 第20段落 の
These methods of constructing derived types can be applied recursively.
を知らなかったという点でした。
ポインタ型も派生型ということで、今まで理解していたポインタの挙動が一層納得出来ました。
YuOさんありがとうございました。
by sys
14年前
フォーラム: C言語何でも質問掲示板
トピック: 配列の規格に沿った読み方について
返信数: 4
閲覧数: 2526

Re: 配列の規格に沿った読み方について

YuOさん、ご回答ありがとうございます。 [一度17時35分に投稿したのですが、間違えが多かったので削除し訂正しました。] C99 6.2.5 をふまえると、 two_array は、最初のポインタは*two_array を指しているけど、配列型派生で再帰的に構築された配列型のポインタをたどって、最終的に先頭要素(**two_array)を指しているポインタ(アドレス)を返す。 ということなのでしょうか?? two_array[0][0] をもう一度考えてみました。 two_array[0][0] は (*(*(two_array))) と等価。 1) two_array はchar[2][3...
by sys
14年前
フォーラム: C言語何でも質問掲示板
トピック: 配列の規格に沿った読み方について
返信数: 4
閲覧数: 2526

配列の規格に沿った読み方について

長文で失礼します。2次元配列の規格に沿った読み方についての質問です。(環境 Xcode 3.2.5 64bit) char two_array[2][3] = { "ab", "cd" }; のとき 私が理解している範囲で two_array[0][0] を読むと、 E1[E2]が (*((E1)+(E2)))と等価であると定義する。 [C99 6.5.2.1 から一部引用] から two_array[0][0] → (*((two_array)+(0)))[0] → (*((*((two_array)+(0)))+(0))) となり、簡素化すると (*(*(two_array))) と読む。...
by sys
14年前
フォーラム: C言語何でも質問掲示板
トピック: 配列へのアドレス演算子、間接演算子について
返信数: 8
閲覧数: 3692

Re: 配列へのアドレス演算子、間接演算子について

性格的に理解出来ないと先に進めないタイプでして、ポインタだけで1ヶ月くらい勉強してます、、、。
最近わかることが多くなってきて、楽しくなってきました。

ありがとうございます。
また利用させて頂きたいと思います。

詳細検索ページへ移動する