関数の外にあるブロック文の扱い?について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら

トピックに返信する


答えを正確にご入力ください。答えられるかどうかでスパムボットか否かを判定します。

BBCode: ON
[img]: ON
[flash]: OFF
[url]: ON
スマイリー: OFF

トピックのレビュー
   

展開ビュー トピックのレビュー: 関数の外にあるブロック文の扱い?について

Re: 関数の外にあるブロック文の扱い?について

#7

by 参照魚 » 2年前

関数tryブロックというのですね...すでにかかれていましたね。
https://www.ibm.com/docs/ja/xl-c-and-cp ... dlers.html

コンストラクタでも使えるようです。
https://docs.oracle.com/cd/E19957-01/80 ... index.html
経験したことのないすごく奇妙な感覚です。

Re: 関数の外にあるブロック文の扱い?について

#6

by 参照魚 » 2年前

自身はそこそこC++を知っているつもりでしたが、この書き方でコンパイルが通ることに驚きました。配列a[10] が10[a] と互換であるのを知った時以上の衝撃です。配列の方はまだ解説を見てなるほどと思いましたが、これの関数の{}が省略(?)できる理由がまったくわかりません。わたしもこれが文法的に正である理由を知りたいです。

Re: 関数の外にあるブロック文の扱い?について

#5

by あたっしゅ » 2年前

コード:

void
func()
try {
} catch(...) {
}


int
main() {
    func();
}


// end.
東上☆海美☆「
これも、とおるみみ。

Re: 関数の外にあるブロック文の扱い?について

#4

by あたっしゅ » 2年前

https://www.onlinegdb.com/ C++17

コード:

/******************************************************************************

Welcome to GDB Online.
GDB online is an online compiler and debugger tool for C, C++, Python, Java, PHP, Ruby, Perl,
C#, VB, Swift, Pascal, Fortran, Haskell, Objective-C, Assembly, HTML, CSS, JS, SQLite, Prolog.
Code, Compile, Run and Debug online from anywhere in world.

*******************************************************************************/
#include <iostream>
#include <stdexcept>
#include <cstdlib>


int
main()
try{
    throw std::runtime_error("hogehoge ...");
} catch (std::exception& e){
	std::cerr << "エラー: " << e.what() << std::endl;
} 
東上☆海美☆「
確かに、とおるっちゃみみ。

コード:

#include <iostream>
#include <stdexcept>
#include <cstdlib>


int
main()
try {
} catch(...) {
}
でとおるから、

コード:

int
main()
{
}
の { の前に try が入って、catch が付いた、
と考えればいいのではみみ ?

Re: 関数の外にあるブロック文の扱い?について

#3

by nashinium » 2年前

解決しました。
プログラミング言語C++という本に記載されていました。どうやら関数tryブロックというものらしいです。(p380)

あと上の投稿に不備がありました。 関数tryブロック内の runtime_errorの前に throwをつけ忘れていました。申し訳ありません。

一応コンパイルと実行した際の画像を載せておきます。画像

Re: 関数の外にあるブロック文の扱い?について

#2

by box » 2年前

これがコードの全体
ホントに?
main関数の閉じカッコがないんですが...。

関数の外にあるブロック文の扱い?について

#1

by nashinium » 2年前

C++初学者です。入門書に記載されていたコードでmain関数の外に try文とcatch文を書いていてどう解釈したらいいか困っています。

コード:

int main()
try{
    	runtime_error("hogehoge ...");
} catch (exception& e){
	std::cerr<<"エラー: "<e.what()<<'\n';
} 
これがコードの全体なのですが、今まで入門書で見たコードではすべてのブロック文は何かしらの関数の中に書かれていたのでこの記述の仕方を始めてみたときは「ブロック文は関数内に書かないといけないはずでは?」とひどく困惑しました。

暇なときにこれについて考えて最終的に至った自分の中の結論が
このブロック文は関数外で変数定義する文と同じ使い方をしているんだ。となったのですが自分でも自信がありません。

コード:

constexpr int hogehoge{10};  // この部分です
int main()
{
    std::cout<<"hogehoge="<<hogehoge;
    return 0;
}  
初学者にもわかるように解説をしていただけると助かります、お願いします。

ページトップ