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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
nashinium
記事: 2
登録日時: 3年前

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

#1

投稿記事 by nashinium » 3年前

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;
}  
初学者にもわかるように解説をしていただけると助かります、お願いします。

box
記事: 2002
登録日時: 14年前

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

#2

投稿記事 by box » 3年前

これがコードの全体
ホントに?
main関数の閉じカッコがないんですが...。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

アバター
nashinium
記事: 2
登録日時: 3年前

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

#3

投稿記事 by nashinium » 3年前

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

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

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

アバター
あたっしゅ
記事: 665
登録日時: 14年前
住所: 東京23区
連絡を取る:

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

#4

投稿記事 by あたっしゅ » 3年前

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 が付いた、
と考えればいいのではみみ ?
VTuber:
東上☆海美☆(とうじょう・うみみ)
http://atassyu.php.xdomain.jp/vtuber/index.html
レスがついていないものを優先して、レスするみみ。時々、見当外れなレスしみみ。

中の人:
手提鞄あたッしュ、[MrAtassyu] 手提鞄屋魚有店
http://ameblo.jp/mratassyu/
Pixiv: 666303
Windows, Mac, Linux, Haiku, Raspbery Pi, Jetson Nano, 電子ブロック 持ち。

アバター
あたっしゅ
記事: 665
登録日時: 14年前
住所: 東京23区
連絡を取る:

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

#5

投稿記事 by あたっしゅ » 3年前

コード:

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


int
main() {
    func();
}


// end.
東上☆海美☆「
これも、とおるみみ。
VTuber:
東上☆海美☆(とうじょう・うみみ)
http://atassyu.php.xdomain.jp/vtuber/index.html
レスがついていないものを優先して、レスするみみ。時々、見当外れなレスしみみ。

中の人:
手提鞄あたッしュ、[MrAtassyu] 手提鞄屋魚有店
http://ameblo.jp/mratassyu/
Pixiv: 666303
Windows, Mac, Linux, Haiku, Raspbery Pi, Jetson Nano, 電子ブロック 持ち。

参照魚
記事: 109
登録日時: 6年前

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

#6

投稿記事 by 参照魚 » 3年前

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

参照魚
記事: 109
登録日時: 6年前

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

#7

投稿記事 by 参照魚 » 3年前

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

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

返信

“C言語何でも質問掲示板” へ戻る