
C言語の記述についての質問です。
関数を書く時に
関数(引数){
…
}
のようになっているかと思いますが、ここで括弧内に引数を書く意味とはなんでしょうか?
関数の本文(?)内でint nなどのように引数の宣言は出来ますし、もしこの括弧内での引数の記述がただの宣言であるなら関数の本文(?)中に書けば良いような気がしますが、これは関数で主に使う引数を明らかにしているということなのでしょうか。
自分はC言語初心者で、他にはRubyなどを学習したことがあるのですが、Rubyの場合、
def 関数(引数)
のように書き始め、Rubyでは実行時に
関数(引数)
で引数部分にターミナルからの標準入力を入れることができ、C言語での
関数(int argc, char *argv[])
のように扱うことが出来ますが、そうでない場合、例えばC言語で
関数(a, b)のように定義したとき、ターミナルからの標準入力をa, bに入れてプログラムを実行するというようなことはできないですよね?
乱文で申し訳ありませんが回答よろしくお願いいたします。急いでます。
A 回答 (6件)
- 最新から表示
- 回答順に表示
No.6
- 回答日時:
> 事実上のエントリポイントであるmainを呼び出すために
> その手前に真のエントリポイント_startがあって、
> これはライブラリに含まれている。
問題は、「その説明」が一体「C言語の仕様」の「どこ」に含まれてるのか、って事だ。
特定の実装がそうだったから、と言って、それが全部そうなってる、と言う「理由付け」にはならない。
実装と仕様を混同してはいけない。
僕が言ってるのは単純にC言語成立時の歴史的経緯における一般常識を言ってるだけ、であって、特定の実装に関する説明をしてるわけじゃない。
また、C言語のmain関数記述に関する「特殊性」に於いてはJIS Cの仕様にも記述されている。
No.5
- 回答日時:
いや、main関数は普通の関数だよ。
事実上のエントリポイントであるmainを呼び出すために
その手前に真のエントリポイント_startがあって、
これはライブラリに含まれている。
この仕掛けは、mainに渡す引数を用意したり、
ランタイムライブラリの初期化をしたりするためでもあるし、
コンパイラがmainを他の関数と全く同じに扱えるためでもある。
_startは、Cではなくアセンブラで書かれている。
No.4
- 回答日時:
> 関数の本文(?)内でint nなどのように引数の宣言は出来ますし、もしこの括弧内での引数の記述がただの宣言であるなら関数の本文(?)中に書けば良いような気がしますが、これは関数で主に使う引数を明らかにしているということなのでしょうか。
それは貴方が書いてるように「関数で主に使う引数を明らかにしている」と言う事だ。
> 自分はC言語初心者で、他にはRubyなどを学習したことがある
のならまずはRubyで説明するけど、
def add(x, y)
x + y
end
と書くのと、
def add()
1 + 2
end
と書くの、との違いだ。前者はxとyはどんな数だろうと取れる、つまり「汎用性がある」関数になってるが、後者は1 + 2と言う計算の「決め打ち」だ。
C言語でも全く同様の「違い」がある。関数本体内で「宣言」しただけの変数はその外部から変更を加える事が出来ないので汎用性はなくなる。
> Rubyの場合、
>def 関数(引数)
>のように書き始め、Rubyでは実行時に
>関数(引数)
>で引数部分にターミナルからの標準入力を入れることができ、C言語での
>関数(int argc, char *argv[])
>のように扱うことが出来ますが
いや、出来ないでしょ。
「ターミナルからの標準入力」が何を指してるか知らないけど、Rubyインタプリタを走らせてもない限り、ターミナル上では関数(引数)は認識出来ない。何故ならターミナルは「Rubyプログラムが何か」を知らないから、だ。
恐らく、勘違いしてるのはその辺じゃないだろうか。Rubyだと
> C言語でのmain(int argc, char *argv[])
にあたるのは単純なRuby関数(っつーかメソッド)ではなく、
if __FILE__ == $PROGRAM_NAME
だ。(あるいはif __FILE__ == $0って書き方もある)
例えばC言語での
#include <stdio.h>
int main(int argc, char *argv[]) {
// 引数の数を表示
printf("引数の数: %d\n", argc);
return 0;
}
と言うコードに対応するRubyのコードは
#!/usr/bin/env ruby
if __FILE__ == $PROGRAM_NAME
puts "引数の数: " + ARGV.length.to_s
end
になる(Rubyの場合はARGVにプログラム名が含まれないが)。
いずれにせよ、C言語のmain(int argc, char *argv[])とRubyのdef 関数(引数)は対応していない。
言い換えると、C言語のmain関数とC言語のフツーの関数を混同してんじゃないか、と考えられる。
C言語はかなりアセンブリ言語の様式を引きずっていて、main関数はアセンブリ言語で言う「エントリポイント」記述、他の「関数」はアセンブリ言語で言う「サブルーチン」を意図してて、Rubyなんかの高級言語で言う関数(あるいはメソッド)とは厳密な意味では一対一対応しているわけじゃないんだ。
それでもサブルーチンはまぁ、そのまま「関数」として考えていいんだけど、一方「エントリポイント」だけは別で扱う必要があって、そういう意味で言うとC言語のmain関数は「関数ではない」。
そしてmain関数「こそ」がターミナルと直接情報をやり取りする為の「プログラムの入口」を意味してる。
繰り返すが、main関数と他の関数を混同しないように。そしてmain関数はRubyの関数ともまた別な関数で対応してないんだ。Cのmain関数にあたるものはRubyではif __FILE__ ==$0 以下、って事になる。
No.1
- 回答日時:
それ、関数定義の文法の問題じゃなく、
処理系がインタプリタかコンパイラかの違いでしょ?
Cでも、コードを
scanf("%d %d", &a, &b);
関数(a,b);
て書けば、プログラムの実行時にソレができる。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- 数学 数学の問題が分かりません! 次の関数y=f(x)の逆関数y=f^-1(x)を求めよ. ※答えが2次関 3 2023/06/22 19:22
- C言語・C++・C# c言語 コマンドライン引数 4 2023/02/09 18:47
- C言語・C++・C# 関数ポインタの高速化のメリット 7 2023/05/05 20:15
- C言語・C++・C# 【至急】C言語の問題です、どなたか分かる方いませんか? 以下のコードは配列abcdeをbodesにず 1 2023/11/08 14:05
- 哲学 フォルダによる本質証明と述語証明 2 2023/10/10 00:53
- C言語・C++・C# C言語 列挙型(enum型)変数について 7 2024/01/15 14:20
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# スタックフレームの消滅 6 2023/05/20 12:33
- C言語・C++・C# C言語の関数と配列に関する質問 8 2024/02/27 15:45
このQ&Aを見た人はこんなQ&Aも見ています
-
C言語 関数、変数の宣言について
C言語・C++・C#
-
C言語のことです。写真(見にくくてすいません)の下のプログラムを実行したいのですが四行目がおかしいと
C言語・C++・C#
-
DNCL(共テ用プログラミング言語)について 写真の(12)のプログラムにおいて、解説によると(12
C言語・C++・C#
-
-
4
プログラミングc++を全く分からない状態から習得するまでどれくらいかかりますか?なぜ難しいと言われて
C言語・C++・C#
-
5
プログラマー達は何故、プログラムを入れるフォルダーに容量制限があるのを知らない?
C言語・C++・C#
-
6
Cのプログラムからアクセスできないファイル名の一括変更方法
C言語・C++・C#
-
7
c++の勉強方法を教えてくださいプログラミングをやった事がなく1から勉強を始めようと思います1日1時
C言語・C++・C#
-
8
C# で 数式文字列処理を処理する方法
C言語・C++・C#
-
9
あってる
C言語・C++・C#
-
10
至急助けてください!!!あと2時間しかないです! ボタンを押したら0ランプが点灯し、コンマ5秒後に1
その他(プログラミング・Web制作)
-
11
DNCL(共テ用プログラミング言語)について 写真の(12)のプログラムにおいて、解説によると(12
C言語・C++・C#
-
12
プログラミングに興味があるのですが、作りたいものはありません。 ゲーム機とかパソコンの中身(ソースコ
その他(プログラミング・Web制作)
-
13
Fortranでシステム時刻をカレンダー時刻に変換
その他(プログラミング・Web制作)
-
14
以下のプログラムの実行結果はどうなると思いますか? その理由も教えてください。
Visual Basic(VBA)
-
15
C言語の関数のextern宣言
C言語・C++・C#
-
16
アセンブラーの命令についてです。
その他(プログラミング・Web制作)
-
17
覚えることが少ないプログラミング言語を教えて下さい。
その他(プログラミング・Web制作)
-
18
IT業で開発をされてる方々に質問なんですが、一日に書かれるコード数ってどれくらいですか? また、最近
その他(プログラミング・Web制作)
-
19
最初に聞かれたこと
C言語・C++・C#
-
20
JIT適用PHP8はJavaサーブレットより処理速度は早く、現在の全Webアプリ内で最速でしょうか?
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
visual studio 2022でのC#プロ...
-
Windows Formアプリからコンソ...
-
c++でテンプレートのコードでわ...
-
C++でデスクトップGUIアプリ開...
-
Linux Cプログラミングを学ぶた...
-
プログラマー達は何故、プログ...
-
最初に聞かれたこと
-
C言語について。
-
C言語について。
-
ストリームについて。
-
C言語の質問です。バイナリ形...
-
大量のデータを読み込んで表示...
-
C言語の関数のextern宣言
-
PIC12F1822でLED調光器を作りたい
-
C言語 関数、変数の宣言について
-
C言語について(初心者)
-
プログラミングc++を全く分か...
-
あってる
-
DNCL(共テ用プログラミング言語...
-
DNCL(共テ用プログラミング言語...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
c言語
-
gccを行ってもexeファイルが生...
-
大量のデータを読み込んで表示...
-
visual studio 2022でのC#プロ...
-
C++でデスクトップGUIアプリ開...
-
【C言語】全角文字の配列を、全...
-
Windows Formアプリからコンソ...
-
VisualStudio2022でC言語プログ...
-
C#でログファイルにファイルパ...
-
C#でTreeViewのCheckBoxのサイ...
-
c#のTLS1.2での通信について
-
VisualStudioでC++クラスを追加...
-
C言語について。
-
int16_t の _t は何?
-
プログラマー達は何故、プログ...
-
逆コンパイルと逆アセンブルの...
-
C言語の関数のextern宣言
-
c言語でイベントフラグを使った...
-
C言語 関数、変数の宣言について
-
[C言語]fputsとfprintfの違い
おすすめ情報
すみません、改めて質問し直します