tag:blogger.com,1999:blog-3636872937372639901.post178010340586041613..comments2024-03-19T15:51:33.256+09:00Comments on 本の虫: 宣言文を飛び越えること江添亮http://www.blogger.com/profile/13387122818743087721noreply@blogger.comBlogger7125tag:blogger.com,1999:blog-3636872937372639901.post-61656945599077032642010-07-29T21:41:24.516+09:002010-07-29T21:41:24.516+09:00うわっ気持ち悪いコードだなぁ
goto + C++のどこでも変数宣言できますよ仕様か
仕様書はど...うわっ気持ち悪いコードだなぁ<br /><br />goto + C++のどこでも変数宣言できますよ仕様か<br /><br />仕様書はどうなってたっけな萌ゑnoreply@blogger.comtag:blogger.com,1999:blog-3636872937372639901.post-87895304105838490532010-07-29T13:20:51.908+09:002010-07-29T13:20:51.908+09:00ただし、ゼロ初期化だけは、あらゆる初期化の前に行わるとされています。
したがって、以下のコードの挙...ただし、ゼロ初期化だけは、あらゆる初期化の前に行わるとされています。<br /><br />したがって、以下のコードの挙動は保証されています。<br /><br />int main()<br />{<br /> goto label ;<br /> static int value ; // ゼロ初期化される<br />label : <br /> // この場合、valueは0であることが保証されている<br /> if ( value == 0 ) ;<br />}江添亮https://www.blogger.com/profile/13387122818743087721noreply@blogger.comtag:blogger.com,1999:blog-3636872937372639901.post-8968358428195139682010-07-29T13:18:36.409+09:002010-07-29T13:18:36.409+09:00intの場合にたまたま宣言文より先に初期化が行われていたが、保障はされないということですね。理解しま...intの場合にたまたま宣言文より先に初期化が行われていたが、保障はされないということですね。理解しました。Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-3636872937372639901.post-30305224196527599672010-07-29T13:09:23.007+09:002010-07-29T13:09:23.007+09:00static変数の初期化は、宣言文より先に行われる場合もあります。
早期に初期化されない場合、宣言文...static変数の初期化は、宣言文より先に行われる場合もあります。<br />早期に初期化されない場合、宣言文が最初に実行された際に、初期化されます。<br /><br />したがって、static変数を使う際には、必ず一度は宣言文を実行しなければなりません。江添亮https://www.blogger.com/profile/13387122818743087721noreply@blogger.comtag:blogger.com,1999:blog-3636872937372639901.post-73264676520444189892010-07-29T12:47:44.300+09:002010-07-29T12:47:44.300+09:00レスありがとうございます。ためしに動かしてみたのですが、手元のgcc4.1.0だとクラスの初期化の場...レスありがとうございます。ためしに動かしてみたのですが、手元のgcc4.1.0だとクラスの初期化の場合はうまく動きませんでした。<br />int main(){<br />goto label;<br />//static int value(3); //OK<br />static std::string value("3"); //NG. seg fault<br />label:<br />std::cout << value;<br />return 0;<br />}<br />これはコンパイラがまずいのか、あるいはプリミティブ型の初期化子とコンストラクタの違いを私が理解してないのか。。Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-3636872937372639901.post-71506236457483844182010-07-29T11:56:52.227+09:002010-07-29T11:56:52.227+09:00そのコードはまったく問題有りません。
初期化式のあるブロックスコープのstatic変数は、その宣言文...そのコードはまったく問題有りません。<br />初期化式のあるブロックスコープのstatic変数は、その宣言文が実行されるまでに初期化されます。江添亮https://www.blogger.com/profile/13387122818743087721noreply@blogger.comtag:blogger.com,1999:blog-3636872937372639901.post-51909042529290161502010-07-29T10:19:11.994+09:002010-07-29T10:19:11.994+09:00領域確保はするけど初期化コードは走らないよ、っていうことなんでしょうか。
ローカルかつstaticな...領域確保はするけど初期化コードは走らないよ、っていうことなんでしょうか。<br />ローカルかつstaticな変数だと初期化できてしまいそうな。。仕様としては不定なんでしょうかne。<br />int main(){<br />goto label ;<br />static int value = 3 ;<br />label:<br />}<br />みたいな。Anonymousnoreply@blogger.com