重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

C言語の記述についての質問です。
関数を書く時に
関数(引数){

}
のようになっているかと思いますが、ここで括弧内に引数を書く意味とはなんでしょうか?
関数の本文(?)内でint nなどのように引数の宣言は出来ますし、もしこの括弧内での引数の記述がただの宣言であるなら関数の本文(?)中に書けば良いような気がしますが、これは関数で主に使う引数を明らかにしているということなのでしょうか。
自分はC言語初心者で、他にはRubyなどを学習したことがあるのですが、Rubyの場合、
def 関数(引数)
のように書き始め、Rubyでは実行時に
関数(引数)
で引数部分にターミナルからの標準入力を入れることができ、C言語での
関数(int argc, char *argv[])
のように扱うことが出来ますが、そうでない場合、例えばC言語で
関数(a, b)のように定義したとき、ターミナルからの標準入力をa, bに入れてプログラムを実行するというようなことはできないですよね?
乱文で申し訳ありませんが回答よろしくお願いいたします。急いでます。

質問者からの補足コメント

  • すみません、改めて質問し直します

      補足日時:2025/01/18 12:40

A 回答 (6件)

> 事実上のエントリポイントであるmainを呼び出すために


> その手前に真のエントリポイント_startがあって、
> これはライブラリに含まれている。

問題は、「その説明」が一体「C言語の仕様」の「どこ」に含まれてるのか、って事だ。
特定の実装がそうだったから、と言って、それが全部そうなってる、と言う「理由付け」にはならない。
実装と仕様を混同してはいけない。
僕が言ってるのは単純にC言語成立時の歴史的経緯における一般常識を言ってるだけ、であって、特定の実装に関する説明をしてるわけじゃない。
また、C言語のmain関数記述に関する「特殊性」に於いてはJIS Cの仕様にも記述されている。
    • good
    • 0

いや、main関数は普通の関数だよ。


事実上のエントリポイントであるmainを呼び出すために
その手前に真のエントリポイント_startがあって、
これはライブラリに含まれている。
この仕掛けは、mainに渡す引数を用意したり、
ランタイムライブラリの初期化をしたりするためでもあるし、
コンパイラがmainを他の関数と全く同じに扱えるためでもある。
_startは、Cではなくアセンブラで書かれている。
    • good
    • 0

> 関数の本文(?)内で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 以下、って事になる。
    • good
    • 1

インターフェイスとして値を受け取っているだけ。

    • good
    • 1

C言語は、私が一番長い間使った言語です。


でも、質問文を読んでも、何を質問したいのか読み取れないです。
私の日本語力不足か?
    • good
    • 5

それ、関数定義の文法の問題じゃなく、


処理系がインタプリタかコンパイラかの違いでしょ?
Cでも、コードを
 scanf("%d %d", &a, &b);
 関数(a,b);
て書けば、プログラムの実行時にソレができる。
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A