- ベストアンサー
printfの使い方
#include <stdio.h> main() { printf("正しい?"); int a; int b; int c; printfをこのように使うと int がここでは 宣言できないとなってしまうのは何故ですか?
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
C++が、途中で変数宣言出来るので、混同されていたりしませんか?? int a; int b; int c; と言うのは、"変数の宣言"をしているのですが、"C言語では"、変数の宣言は、printfとか、計算とか、そういった処理をする前に全て用意しておかなければいけない。 と言う決まりがあります。 C言語の書き方的に間違っているから、違うよ。と言われているだけです。 main関数なら、main関数の中で、 main() { 変数宣言 処理 } とする。と、覚えて下されば良いかと思います。
その他の回答 (7)
- PG_RankB
- ベストアンサー率40% (12/30)
すみません、適当な事を書くつもりはなかったのですが、質問内容から見て、なるべく簡易な書き方で答えるべきかなと思いましたので・・・Cのバージョンによっては、位つけておくべきでした。 皆様の仰るとおり、C言語自身にもバージョン(のようなもの)があり、C99(日本工業規格ではJIS X 3010:2003)と呼ばれる現時点での最新の規格では、C++と同じく途中での宣言が可能ですね。 ただ、その規格をサポートしているかどうかは、処理系に依存しますし、私自身は、開発現場でもまだあまりC99を見た事がありません。 質問内容で問題に上がっている時点で、C95(JIS X 3010:1996)等、C99よりも前の規格だとは思いますが。 C99はC++の機能を参考にされたと言う背景もありますし、C言語だから必ずC++よりも古いと言う状況では無くなってきています; これからC99が普及してくるのだとすれば、これらの違いを知っておく事は、開発する際に余計な問題を発生させずに済みますから、suseimei様の言うとおり、ある程度事前の分析・勉強は必要になるかと思います。 きちんと切り分け可能なレベルまで来ていれば、特に問題では無いですが・・・ ANSIが規格統一を行ったとは言え、C言語自身のバージョンやプラットフォームの違い、処理系、国の違い等で、差異があると言う事実は、やはり少なからず実感しますね。 些細な質問でも、質問者様がご自身の開発環境なりOSなりを書いて下さると言う事が、こういった場では大切だと言う事ですね;
- suseimei
- ベストアンサー率35% (17/48)
たびたび申し訳ありません。次の環境でソースコードをビルドしました。 環境:無料のVC++2005 Expess Edition スイッチ:Cコード生成 次のようなエラーが出ました。 ------ Build started: Project: c99right, Configuration: Debug Win32 ------ Compiling... printf.cpp c:\my documents\visual studio 2005\projects\c99right\c99right\printf.cpp(7) : error C2143: syntax error : missing ';' before 'type' c:\my documents\visual studio 2005\projects\c99right\c99right\printf.cpp(8) : error C2143: syntax error : missing ';' before 'type' c:\my documents\visual studio 2005\projects\c99right\c99right\printf.cpp(9) : error C2143: syntax error : missing ';' before 'type' Build Time 0:01 Build log was saved at "file://c:\My Documents\Visual Studio 2005\Projects\c99right\c99right\Debug\BuildLog.htm" c99right - 3 error(s), 0 warning(s) ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== C++としてビルドした際には問題ありませんでした。皆様にご報告しておきます。 結論: CでもC++でも場当たり的なコードを書かないように、事前にしっかり分析しておく、ということでしょうね。 疑問: ところで皆さん、この疑問への回答が分かったところで、何か得るものがありますか?2回ビルドしましたが、空しさだけが。。。 CとC++の間には表現力の差がありますから、以前紹介した次のページの情報はチラッとでも目を通してべきでしょうね。 http://www.ttoyota.com/php/cppnovicecontents.php
- naoya0302
- ベストアンサー率39% (13/33)
C++なら、このソースでも問題ないと思います。 Cだと一番上に宣言をする必要があるので。 拡張子を.cppに変更してコンパイルしてみてください。 C++でCの記述をしてもまったく問題ないので。
- Trick--x--
- ベストアンサー率26% (19/72)
#蛇足 C99規格では多くの改定があったようですね。 質問者さんのコンパイラはC95以前のものなのでしょう。
- 参考URL:
- http://seclan.dll.jp/c99d/
- suseimei
- ベストアンサー率35% (17/48)
少し気になりましたので、問題のソースコードをビルドしてみました。 環境は、Microsoftの無料Visual C++ 2005 Express Editionです。 この環境でビルドすると、次のようなビルド結果が返されました。 ------ Build started: Project: c99right, Configuration: Debug Win32 ------ Compiling... printf.cpp c:\my documents\visual studio 2005\projects\c99right\c99right\printf.cpp(7) : warning C4101: 'i' : unreferenced local variable c:\my documents\visual studio 2005\projects\c99right\c99right\printf.cpp(9) : warning C4101: 'k' : unreferenced local variable c:\my documents\visual studio 2005\projects\c99right\c99right\printf.cpp(8) : warning C4101: 'j' : unreferenced local variable Compiling manifest to resources... Linking... Embedding manifest... Build Time 0:06 Build log was saved at "file://c:\My Documents\Visual Studio 2005\Projects\c99right\c99right\Debug\BuildLog.htm" c99right - 0 error(s), 3 warning(s) ========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ========== ただし、生成コードをC++としております(デフォルト)。 これはうろ覚えですが、C99などの新仕様で許される宣言になったのではないですか? コンパイラの種類やバージョンによっては、「宣言できる」となるかもしれません。 ご自身で挑戦してみてください。なお、無料のVC++に興味がある場合には、参考URLから公開されている情報に目を通すとよいと思います。 参考になれば幸いです。
- suseimei
- ベストアンサー率35% (17/48)
よい質問ですね。すでに他の方も触れていらっしゃいますが、CとC++の違いというものもあります。また、CはC++の影響も受けています。このような言語設計の歴史をある程度学んでおくことはきわめて大切です。 プログラミングは、ただ命令を書き連ねればよい、というものではありません。次のページから公開されている「CとC++の歴史的な発展」を読むと本当にためになります。 http://www.ttoyota.com/php/cppnovicecontents.php ぜひ一読してください。C++設計者のBjarne Stroustrup氏が先輩格である「C」をどのように認識していたのかなどが分かります。
- jacta
- ベストアンサー率26% (845/3158)
C++や最新のC言語であれば、宣言をブロックの途中で書くことができますが、古い仕様のC言語では、宣言は関数の外かブロックの先頭でなければ行うことができません。
お礼
問題は解決しました!! お忙しい中、有難うございました!!
お礼
基本中の基本をお聴きしてしまったようですね。 とてもよくわかりました!! お忙しい中、有難うございました!