C言語なら、俺に聞け! <21>

このエントリーをはてなブックマークに追加
scanf;
は正しい式だから、ANSI準拠に従う以上、エラーにしちゃいけない。
警告を出すかどうかは処理系実装者の任意だけど。
何を意味するかというと、scanf関数の関数ポインタを取得して、それを何もしない。
呼び出すわけでもなく。
ただ単に式の値は捨てられる。
って感じ?
配列のポインタ配列の識別子にアドレス演算子がいらないように関数にも要らない!
互換性のある型!!

int ia[10];
int (*iap)[10] = ia;//&iaでもよい無くてもよい

コンパーチブル!!
954950:02/05/26 17:00
駄目だった。スレ立てすぎらしい。

代わりに立てて >>957
>>953
> int ia[10];
> int (*iap)[10] = ia;//&iaでもよい無くてもよい
アドレスは同じでも型は同じか?
printf("%p", scanf);
957900:02/05/26 17:04
>>943, >>950, >>952
だから...
> 1. 式って言うなら、int (*a)(); a; との違いはなんだ ?
に誰か、答えられるの ? (特に、>>910-912 みたいに偉そうに書いてた奴、
どうよ。単なる煽り屋さんか ?)

>>950
>> int (*a)(); a;
> これやるとBCC32では警告が出るんですが…
なんてでてます ? また、int a; a; でもでるのかな ?
(処理系の名前忘れたけど、"無効な式です" とか言う警告が出る奴はある。)
>>957
次スレよろしこ。
次スレ1もvoidで頼む。
960デフォルトの名無しさん:02/05/26 17:11
今話題になっているSHARPポケコンPC-G850内蔵のC言語ってどうなんでしょう。
900が何を騒いでいるのかわからんのだけど。

int scanf(const char *, ...);
というプロトタイプがあるとき、

scanf; はエラーじゃない。
int (*)(const char *,...)型の式の後ろに;をつけた文になる。

scanf(); はエラーだ。
int scanf(const char *,...)を、矛盾する引数で呼び出したから。
                       ^^^^^^^^^^^^^^
int (*a)(int);

a; // エラーじゃない
a(); // エラー
a(1); // エラーじゃない
963904:02/05/26 17:14
>>957
煽りやさんはあんただろ。
> 1. 式って言うなら、int (*a)(); a; との違いはなんだ ?
a()と int(*a)();a;の違い?
前者は引数なし関数aの呼び出し
後者は引数なし関数ポインタaの宣言と式aのみから成り立った文。
ちゃんとひよこ本のリンクはれや、ゴルァ!
あー、ひょっとして900は、他の一部の言語(Modula-2とかRubyとか)
みたいに、
scanf;

scanf();
も同じように引数0個の関数呼び出しになると思ってたのかな?

Cだと、()を付けない限り関数呼び出しは起きないんだよ。
誰かスレ立てろ
俺は立てすぎらしい
967ダックソンW世:02/05/26 17:24
GNU + Cygnus + Windows = Cygwin (・∀・)イイ!
968900:02/05/26 17:24
>>963
げっ、こいつほんとにわかってなかったのかよ。>>942 の「>>922
質問の意図はわかってるだろうから」て言うのは、取り消しだ。

誰が、「a()と int(*a)();a;の違い?」を問題にしてんだよ。
scanf; と (int (*a)(); としたあとの) a; の違いを示せって言ってんの
わからんか、それとも 1000 も近いから単なる時間稼ぎか ?
俺が立ててみます。ちょいお待ちを。
970904:02/05/26 17:28
>>968
あんた偉そうだな、いちいち過去ログ見るのも億劫だから適当に書いただけだ。
それならほとんど違いはないよ、違いは関数のアドレスか、関数ポインタの値か、それだけ。

971969:02/05/26 17:33
俺もスレ立てすぎでした・・・。
誰か頼む。
テンプレ

-------------------------------------------------------
C言語なら、俺に聞け! <22>

日下部陽一


漏れは38才、21年間プログラムを一生懸命作ってきた。
いろいろな言語を極めたが、一番手になじむのはCだった。
Cのことならぜんてわかるから、疑問な点があったら漏れに聞け。

だが、いちいちFAQに載った質問に応えるほど暇じゃない。
課題丸投げなら別スレにいけ。

・C FAQ 日本語訳
http://www.catnet.ne.jp/kouno/c_faq/c_faq.html
・comp.lang.c FAQ(英語の原文)
http://www.eskimo.com/~scs/C-faq/top.html
Cプログラマ必読 ・プログラミング言語C(通称 K&R)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/
推薦図書/必読書のためのスレッド PART3
http://pc.2ch.net/test/read.cgi/tech/1016722820/

・前スレ
<21> http://pc.2ch.net/test/read.cgi/tech/1022045622/

他のリンクは>>2-10を見な。
> うぉ、本当だ。VC++ 6 でやると、警告は出るがコンパイルは通る。
> (でも、何も生成されない。) 何で、エラーにしないんだ ?
> scanf(); ならエラーにするくせに...。

この発言を馬鹿にされて逆ギレしてただけじゃなかったの?
900は「scanf();はエラーになるのにscanf;やa();がなぜ
エラーでないのかワカリマシェン。誰か教えて〜(泣」
って言ってるんじゃないの?

答は出てるんだが。
かぶせられた
>>968
>scanf; と (int (*a)(); としたあとの) a; の違いを示せって言ってんの

へ?何が違うの?
976950:02/05/26 17:35
警告 W8019 a.c 5: コードは効果を持たない(関数 main )
と出る。

>>968
scanf; は文だって…
例えば
int (*a)(const char *, ...);
a = scanf;
として
a(どうのこうの);
とすればscanfとして動く。
a = printf;
と、途中で変えることもできる。

ようは
int a[256];

int *a;
との違いみたいなもん。
問題がすりかわってる悪寒・・・
978日下部陽一:02/05/26 17:37
http://pc.2ch.net/test/read.cgi/tech/1022402165/
新スレです。移動願います
979サンプル:02/05/26 17:39
#include <stdio.h>

int main(){
int (*a)();
int hage;
a = scanf;
a("%d",&hage);
a = printf;
a("%d\n",hage);

scanf = printf; /*エラーだよ*/
return 0;
}
こんなもんで。
あとは邪推してくれ。
前スレ900は何を教えて欲しいのかもう一度説明するべきだと思うな。
俺は「scanf;が関数呼び出しだと思っていた」に一票だが。
>>980
単なる()の付け忘れだろ。何をそんなに熱くなってるんだか・・・。

しかし、scanf;でコンパイル通るのか。
関数ポインタがごろんと転がっているだけの感じだがな。
0x44548883;
とかいう感じで。
前スレ900?
熱いのは900れす
>>979
int (*a)(cont char *,...);じゃなくていいの?
985980:02/05/26 17:51
新スレに書いたつもりが誤爆しました。
http://pc.2ch.net/test/read.cgi/tech/1022402165/10
に書き直した。
986950:02/05/26 17:51
>>977
・・・正解!

まあ scanf; a; ってのはたいした違いは無いよね。
1; と 2; の違いを言えってなもんだし。
むしろ
printf("hoge\n");
a = 3;
とかとも違いが無い(printfもintを返すし、代入式も値がある)。
つまり値が返されても値を受け取らなかったらそれは無視されるってこと。

俺は疲れた。
アセンブリ勉強してくれ。
pascalはやらないでくれ。
あれは900宛てじゃ
      ,, ,=、  ,, , =、
     ff | }!、,、〃 / ″このスレ怖いー!!
      ,リ/ .ノ*´jコ`)'〃
    {{ { ′   v' 《
     ヾ.\.   \ヾ
     _,,二、》   ;  \. 三,_
  (( ゙ー=、`″〃 \. \-‐' ,))
        ゙ー=″     ゙' 一'
>>984
int (*a)();
という宣言なら、どんな実引数で呼び出しても文法上はOK。

ただしこの宣言だと、可変長引数のプロトタイプ宣言をされた
関数は呼び出せない。(呼び出すと未定義の動作になる。)
とある質問だけで、100レスもつくとは。。。。
(((( ;゚Д゚))))ガクガクブルブル
>>990
おいおい、NULLの話なんかいくつレスが付いたと思ってるんだ?
992900:02/05/26 18:20
>>973
> 900は「scanf();はエラーになるのにscanf;やa();がなぜ
> エラーでないのかワカリマシェン。誰か教えて〜(泣」
> って言ってるんじゃないの?
バカ。>>920 見ろ。俺が言いたいのは、scanf; が警告出るのに、a; が警告
でないのは、何でだ。ってことだ。(要は、VC は (この点に関しては) バカ
だと言ってるだけだよ。)

いいかげん、scanf(); と scanf; の違いを偉そうに語るのはやめてくれ。

>>976
なるほど、BCC はちゃんと警告出るわけだ。int a; a; でもてるんだろう
なァ...。
993900:02/05/26 18:22
>>902, >>904
関数プロトタイプ知らんの ? だったら、何で scanf(); はエラーに
するのか説明しろよ。
>>920の時点で問題がすりかわってる罠
900さん熱いね。
よーし、パパどうでもいい話なのでこのままコソーリ1000狙ちゃうぞー
      \∧_ヘ     / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
 ,,、,、,,, / \〇ノゝ∩ < 1000取り合戦、いくぞゴルァ!!       ,,、,、,,,
    /三√ ゚Д゚) /   \____________  ,,、,、,,,
     /三/| ゚U゚|\      ,,、,、,,,                       ,,、,、,,,
 ,,、,、,,, U (:::::::::::)  ,,、,、,,,         \オーーーーーーーッ!!/
      //三/|三|\     ∧_∧∧_∧ ∧_∧∧_∧∧_∧∧_∧
      ∪  ∪       (    )    (     )   (    )    )
 ,,、,、,,,       ,,、,、,,,  ∧_∧∧_∧∧_∧ ∧_∧∧_∧∧_∧∧_∧
      ,,、,、,,,       (    )    (    )    (    )    (    )
ああ、そういうこと。VC++の警告メッセージが違ってると。ふーん。

あれ、ひょっとしてVC6って、
scanf;
でscanf();と同じコードが出るの?
だったらコンパイラのバグだね。
いまだ!
1000900:02/05/26 18:27
1000
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。