トップページ⇒tech
1001コメント292KB

C言語なら俺に聞け(入門篇) Part 43

レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん2009/01/24(土) 19:00:13
C言語の入門者向け解説スレです。

教えて欲しいのではなく宿題を丸投げしたいだけなら
↓宿題スレ↓へ行ってください。
 C/C++の宿題を片付けます 122代目
 http://pc11.2ch.net/test/read.cgi/tech/1232001038/

・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
  # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること
  # サイズが大きい場合は宿題スレのアップローダ等を利用してください
・開発環境や動作環境も晒すと答えが早いかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。

前スレ
C言語なら俺に聞け(入門篇) Part 42
http://pc11.2ch.net/test/read.cgi/tech/1231180205/
過去スレ
  http://makimo.to:8000/cgi-bin/search/search.cgi?q=%82b%8C%BE%8C%EA%82%C8%82%E7%89%B4%82%C9%95%B7%82%AF&andor=AND&sf=0&H=&view=table&D=tech&shw=5000
0951デフォルトの名無しさん2009/02/06(金) 22:33:28
出力ファイル名をa.exe以外にすればいい
0952デフォルトの名無しさん2009/02/06(金) 22:33:36
>>950
gcc --help
0953デフォルトの名無しさん2009/02/06(金) 22:36:12
>>950
gcc -o hoge.exe hoge.c
オプションの詳細は「man gcc」を実行。(※英語)
あと、Cygwinには標準で「test」って名前のコマンドがあるので注意。
0954デフォルトの名無しさん2009/02/06(金) 22:36:55
gcc -o 出力してほしいファイル名 test.c
0955デフォルトの名無しさん2009/02/06(金) 22:38:53
int型の変数 a, b, cがあり、
c = a / b;
と割り算したいのですが、
cには小数切り上げた整数を入れたいのです。

c = (int)(a(double) / b + 0.99999999);
↑
こんなん思いついたのですが、0.99999999では完璧ではありません・・・
(a÷bが3.0000000000000000001だった場合等)

そこで諸先輩のお知恵をお貸し頂きたい!
0956デフォルトの名無しさん2009/02/06(金) 22:41:38
ceil
09579552009/02/06(金) 22:44:46
>>956
超ありがとう!
0958デフォルトの名無しさん2009/02/06(金) 22:45:54
C言語(笑)
0959>>9502009/02/06(金) 22:47:02
アドバイスありがとうございました。
アドバイスどおりやったら出来ました。
0960デフォルトの名無しさん2009/02/06(金) 22:47:59
>>958
笑ってる意味が誰にもわからない
駅前のあぶないオヤジと同じ
0961デフォルトの名無しさん2009/02/06(金) 22:51:02
C言語(泣)
0962デフォルトの名無しさん2009/02/06(金) 22:52:49
>>961
ポインタがわからなくて挫折したんだな
0963デフォルトの名無しさん2009/02/06(金) 22:55:32
C言語(嬉)
0964デフォルトの名無しさん2009/02/06(金) 22:57:16
ポインターがわからない奴なんて実際存在しない。
都市伝説。
0965デフォルトの名無しさん2009/02/06(金) 23:32:18
ポインタどころか、変数の概念が最後まで理解できなかった奴も存在する。
0966デフォルトの名無しさん2009/02/06(金) 23:32:34
ボイン太を知らない奴なんて実在する
0967デフォルトの名無しさん2009/02/06(金) 23:32:38
いや居るだろ。
俺とか。
0968デフォルトの名無しさん2009/02/06(金) 23:41:34
ポインタは分からんが参照は完璧に理解しているぜ
0969デフォルトの名無しさん2009/02/06(金) 23:51:29
わからんと言うか他人の書いたポインタ操作は読んでる途中で嫌になる。
0970デフォルトの名無しさん2009/02/07(土) 00:19:32
ポインタなら俺に聞け
0971デフォルトの名無しさん2009/02/07(土) 00:27:00
ポインタは分かるがダブルポインタが分からない
0972デフォルトの名無しさん2009/02/07(土) 00:28:33
はいはい
0973デフォルトの名無しさん2009/02/07(土) 00:43:03
ダブルポインタはないわー
0974デフォルトの名無しさん2009/02/07(土) 00:48:10
ポインタのポインタをダブルポインタって呼ぶのがそもそもおかしいんだよ

日本銀行は銀行の銀行だけどダブル銀行って呼んだらおかしいだろ?
0975デフォルトの名無しさん2009/02/07(土) 00:49:49
別に何もダブルになってないもんな
0976デフォルトの名無しさん2009/02/07(土) 00:56:25
void main(void){ ; }
↑に限った話じゃないが、セミコロン単体がソースに入っててもコンパイルするけど
C言語(のコンパイラ)って、『何もない』という物を文とみなしてるの?
void型関数を呼び出すのと同じ事なのだろうか???

『;1,2;』(コンパイルOK) 『;1,,2;』(XX) 『;(void)1,(void)2;』(OK)
『for(;;);;』(OK) 『if((void)2);;』(XX)『if((void)2,1);;』(OK)
感覚的には分かる。forはコンパイラで特殊操作かな。ifは当たり前か?
でも全体的にどこかパッとしない。
0977デフォルトの名無しさん2009/02/07(土) 01:01:00
セミコロンだけの文を空文と言う。
空文を使うと、終了条件満たすまでずっとループしたい場合に

while(MainLoop())
 ;

なんてことができたりする。
個人的には

while(MainLoop()) {
 /* 終了条件満たすまでひたすらループ */
}

みたいに書くけど。
0978デフォルトの名無しさん2009/02/07(土) 01:44:54
空文という言葉があったんですか。 for(p=string;p!=0;p++) ; みたいなコード、割と高機能なので使ってます。
でも、
「void型」=「何も返さない」 、 「空白」=「何もない」=「void型と同処理」
だと思ってたんですが、
『空白+セミコロン』は空文だとして、『空白+演算子+値』はどれもエラー、『void+順次演算子+void』は正常。
が腑に落ちない・・・と思ったんですけど、フリーフォーマットを逆算して考えると解決っぽいですね。
0979デフォルトの名無しさん2009/02/07(土) 02:00:41
;=null statement.
0980デフォルトの名無しさん2009/02/07(土) 02:31:54
>>978
式と文を混同しているな。
文は式文、宣言文、複合文、制御文、ラベル付き文、空文の6つに分けられる。

・ 式文        式にセミコロンを付けたもの。
・ 宣言文      変数、型などの宣言を行う文。
・ 複合文      複数の文を { } で囲んだもの。
・ 制御文     if 文, for 文, while 文など。
・ ラベル付き文 文にラベルをつけたもの。(このため、ラベルの次には必ず文が必要になる)
・ 空文        セミコロンのみの文。

void 型の関数呼び出しは式文に当たる。
例えば void foo(void); という関数があった場合、
foo() という式があって、それにセミコロンをつけて foo(); という式文になる。
foo() という式の型は void 。void 式とか言うこともある、立派な式だ。

空文は式にセミコロンをつけたものではないので、式文ではない。
式文と空文は文法上厳密に区別される。
0981デフォルトの名無しさん2009/02/07(土) 02:37:05
式の説明はしないの?
0982デフォルトの名無しさん2009/02/07(土) 02:40:36
空文は、ブロックの最後にラベルを書きたい場合にも使うことができる。

for(i = 0; i < n; i++) {
 for(j = 0; j < n; j++) {
  for(k = 0; k < n; k++) {
   if(hoge) goto BREAK2;
  }
 }
BREAK2:; ←これ
}
0983デフォルトの名無しさん2009/02/07(土) 02:41:16
gnu 拡張C を活用したコードみたら796の様な育ち方をしたマは発狂するだろう
0984デフォルトの名無しさん2009/02/07(土) 02:51:16
式は即値、変数、関数、そしてこれらに演算子を作用させたもの。
変数、関数は、その宣言や定義(関数定義では { } の外)に現れるものを除く。
0985デフォルトの名無しさん2009/02/07(土) 03:24:46
,の説明がまだだね
09869762009/02/07(土) 04:13:19
>>980-984
すごく分かりやすかったです!式・文の区別はしてたつもりでしたが
おそらく、コンパイラは内部的に空文をvoid型の式文に変換すると考えてました。
文の読み取りで空白をvoidに置き換えるなら、式でもvoidを扱える条件演算子が機能しない理由は?という風に。

ところで、セミコロンは文の終わりを指しますが、文は必ずしもセミコロンで終わるわけではないですよね。
if(/*此処*/) for(i=0;i<N;/*此処*/) while(/*此処*/) が、疑問として残ってます。
あと、switch文やgoto文でループ内にでも強制的に入れますが、
for(i=0;i<N;i++) FLAG: { /*処理*/ } ができる理由が分かりました。
しかし、forの引数にあたる部分(括弧内)は、文ですよね?
空文・式文は入れてラベル付き文が入れないのが、しっくり来ないです。
今までただただ仕様、と考えてましたが・・・・(飛ぶなよ、ってのは確かですけど)
0987デフォルトの名無しさん2009/02/07(土) 05:16:05
セミコロンは単独で空文
式にセミコロンをつけたものが式文
それだけのこと。

文は文だから、上記2つの「セミコロンで終わる文」も含めて、全て「文」。

for文は、「for (式;式;式) 文」という形の文法が規定されていて、
区切りとしてセミコロンが採用されているだけ。
0988デフォルトの名無しさん2009/02/07(土) 06:47:41
>>942 VisualStudioをカタカナで書いたの初めて見たよ
0989デフォルトの名無しさん2009/02/07(土) 07:53:19
いわゆるポインタとは、ポインタ変数の事を指しているのですか?
0990デフォルトの名無しさん2009/02/07(土) 08:24:06
次スレ立てました
C言語なら俺に聞け(入門篇) Part 44
http://pc11.2ch.net/test/read.cgi/tech/1233962622/
0991デフォルトの名無しさん2009/02/07(土) 11:11:27
まぁ、BNFの読み方と抽象構文木(AST)の概念を理解すると、より理解が深まるんじゃないかな。
0992デフォルトの名無しさん2009/02/07(土) 12:58:03
>>989
単にポインタと言った場合には文脈で判断する必要がある。
もちろん、ポインタ値とポインタ変数は区別して呼ぶのがより良いが、
それはポインタに限った話ではない。
0993デフォルトの名無しさん2009/02/07(土) 13:34:58
ume
0994デフォルトの名無しさん2009/02/07(土) 13:44:38
産めj
0995デフォルトの名無しさん2009/02/07(土) 15:33:43
>>985
if (a, b) hoge(); の , はコンマ演算子で、
foo(a, b); の , は関数呼び出し演算子の一部としての扱いになる。
従って >>984 で既に説明されている。
0996デフォルトの名無しさん2009/02/07(土) 15:38:03
>>987
C99 では for 文は for(初期化文 式; 式) 文 と定義されてたと思う。
初期化文に書けるのは、式文と宣言文と空文だけだけど。
0997デフォルトの名無しさん2009/02/07(土) 16:27:33
typo?
0998デフォルトの名無しさん2009/02/07(土) 16:28:59
>>996
for(;;)について言えば、初期化文が空文で済むが、あとの式が空でもいいのか?
0999デフォルトの名無しさん2009/02/07(土) 16:41:28
>>998
後の2つの部分は式(ただし省略可)というような定義のはず。
1000デフォルトの名無しさん2009/02/07(土) 16:47:34
          ,,―‐.                  r-、    _,--,、
     ,―-、 .| ./''i、│  r-,,,,,,,,,,,,,,,,,,,,,,,,―ー.    ゙l, `"゙゙゙゙゙ ̄^   \
    /   \ ヽ,゙'゙_,/   .゙l、         `i、   \ _,,―ー'''/  .,r'"
.,,,、.,,i´ .,/^'i、 `'i、``     `--‐'''''''''''''''"'''''''''''゙     `゛   .丿  .,/
{ ""  ,/`  ヽ、 `'i、                        丿  .,/`
.ヽ、 丿    \  .\                      ,/′ 、ヽ,,、
  ゙'ー'"      ゙'i、  ‘i、.r-、      __,,,,,,,,--、     / .,/\ `'-,、
           ヽ  .]゙l `゙゙゙゙"゙゙゙゙ ̄ ̄     `'i、  ,/ .,,/   .ヽ  \
            ゙ヽ_/ .ヽ_.,,,,--―――――ー-ノ_,/゙,,/′     ゙l   ,"
                 `             ゙‐''"`        ゙'ー'"
10011001Over 1000Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。