2 :
デフォルトの名無しさん :2009/01/24(土) 19:35:18
C はひどい言語だ。これは、多くの平均以下のプログラマーが 使ってるためにさらに輪をかけてゲロゲロになっていて、どうし ようもないゴミが簡単に生産されるようになってる。正直いって、 C++ を選ぶ理由が C プログラマーを追っぱらうため *だけ* だっ たとしても、それ自体、C++ を使う強力な理由になりうる。 Linus Torvalds
この世界にはLinus Torvaldsが何人いるんだ
構造体ポインタを引数として関数に送って、 構造体ポインタを戻り値としたいときはどうすればよいのですか? STRUCTURE player_entry(STRUCTURE ptr, int count) ・・・ return ptr; { ・・・ ptr = player_entry(ptr, count); ・・・ このようにしたらエラーになってしまいます。
STRUCTURE型の定義を見ないことにはわからないが、 たぶん、こう STRUCTURE *player_entry(STRUCTURE *ptr, int count)
>>5 たぶんできました。ありがとうございます。
関数名に*をつける発想はありませんでした、、
関数名につけてるわけじゃねーぞw
void serch_name(LIST list) という関数内で社員名を入力させて その社員が構造体のメンバ(list->name)にあるかどうか調べたいんですが どーすればいいか分かりません。 while(line != NULL){ ・・・・ line = line->next; } この形で走査したいんですが よろしくお願いします。
nameの型が何か知らないけどchar[]かchar*ならstrcmpを使え
10 :
デフォルトの名無しさん :2009/01/24(土) 23:29:50
11 :
デフォルトの名無しさん :2009/01/24(土) 23:51:33
変数をNULLで初期化する利点は何ですか。
変数を初期化しないこと自体問題が多過ぎる。 初期化しない奴は初期化忘れによるバグを大量に発生させる。
>>11 初期化するかしないかは変数による
NULLでするかどうかも変数による
14 :
デフォルトの名無しさん :2009/01/25(日) 00:35:07
質問です。 たとえば、char *p="abc"というポインタ変数があって、 それには何かきまったアドレスがあるわけです。 そのアドレスを別のアドレスに変えるにはどうすればいいんですか。
ポインタ変数のアドレスを変えたいなら別のポインタ変数を作って代入すればいいと思うよ。
>>ポインタ変数があって、それには何かきまったアドレスがある 「それ」は、ポインタ変数を指示しているので、pのアドレスのこと、つまり、値としては、&pである。 これを変えるのは、難しい。アセンブリレベルでコードを書き換えてからコンパイルするか。バイナリをハックするか。
18 :
デフォルトの名無しさん :2009/01/25(日) 00:59:42
>>17 アセンブリの段階で変数とか消滅してるけどな
変数じゃなくて変数名p
何この糞な流れ
もっとがんばろうぜ
23 :
デフォルトの名無しさん :2009/01/25(日) 01:30:26
while(c<11){ a=strcmp(pnt[b],pnt[c+1]); if(a>0){ b=c+1; } c++; } エラーは起きないのにこのwhile文にだけ入らないみたい。 なんで?? ちなみにC=0です。 これ以外のどこかがおかしいから入らないのかな?
とりあえずc==0なのか出力して確かめろよ
>>23 whileに挿れる前の、初めてのcが11以下なのか、どうなのか?チェキして
26 :
デフォルトの名無しさん :2009/01/25(日) 01:39:57
小数点の計算なんですけれど int a = 130; int b = 100; double c; c = a / b; こうするとエラーが起こります。 よろしくお願いします。
エラーメッセージ書いて
>>27 ちゃんとcは1になると思うが、どういうエラーが起こるんだ
30 :
27 :2009/01/25(日) 03:48:53
>>28 >>29 申し訳ないです。
bの値が0であったためエラーが起きたみたいです。
型の違いに対する警告じゃね?
>>27 cに代入した値は、何か別の場所で使ってる?
ヘッダーファイルをインクルードせずにコンパイルおよび実行できてしまったのですが これは何でですか? 具体的には int main(void) { printf("%f\n", sqrt(3)); return 0; } です。 stdio.h math.h をインクルードしないとエラーが出ると思ったのですが・・・ 環境は cygwin gcc 3.4.4です。 コンパイルオプションなどは特に設定してません。
どのエラーを期待してるのかわからないが、-Wall をつければ いくつか警告がでるはず。 一般的に必須なのは math.h sqrt() の返り値が double であると宣言する必要がある。 ただし、gccはprintfのフォーマット演算子の解析しているので、 "%f"から double を類推できて、問題なく動いているのだと思う。
36 :
34 :2009/01/25(日) 09:14:06
>>35 数年の記憶ではエラーが出たような気がして。
-Wall試してみました。警告出てきました。
ですが、エラーにならないならインクルードする必要がないってことになってしまいませんか?
それとも、このエラーにならないってのはgccの仕様であって、
C89やC99では認められてなかったりするのでしょうか?
数年前の記憶では です。
>>36 コンパイルエラーのことを気にしてるのなら、文法的に間違ってない
のだから、コンパイルは通るだろう
コンパイラ依存だな。 今の gcc は double sqrt(double) だってインクルードしなくても知ってて、 それでうまく動くだけに過ぎない。 規格合致の挙動では、 関数プロトタイプのない状況では sqrt(3) とすると int sqrt(int) であるかのように sqrt を呼び出すので変になる。
>それとも、このエラーにならないってのはgccの仕様であって、 >C89やC99では認められてなかったりするのでしょうか? そのとおり
>>38 未定義だから、コンパイル出来なくても良いんじゃない?
42 :
27 :2009/01/25(日) 14:21:33
>>31 >>32 >>33 int a,b;
double c;
a=10;
b=20;
c = a / b;
こうすると0.0000となってしまいます。
ただしい計算するにはどうすれば良いですか?
c = (double)a / b; または c = a / (double)b; c = a / bは、double = int / intだから、intで評価したあと暗黙的にdouble型にキャストされて代入される。 整数型の/演算は、少数切捨てになるので、a / b == 0これが、double型にキャストされてcにdouble型で0を表すビット列が代入される。
44 :
27 :2009/01/25(日) 14:35:11
>>43 ありがとうございます。
正しい計算ができるようになりました。
新しく買った教本に 「複合文に特有の変数はその複合文内で宣言して利用せよ」 とあるのですが、本当でしょうか? 前の教本では特にそういう記述は無く、 ローカル変数はすべてその関数のはじめで宣言されていますが、 どちらが一般的なんでしょう?
>>45 新しい本のほうを信じろ。
変数の有効範囲はできるだけ限定されていたほうが、また未初期化の状態を減らすほうが
後から、または他人が見たときに追いかけやすい。
さらにその考えを進めた結果、Cを元にした言語のすべて、そしてC自身の最新の規格では
変数の宣言は複合文の先頭である必要さらなくなっているほどだ。
確かに、関数先頭で全部宣言するやり方も根強いがもう古い。
返信ありがとうございます。今度からそのようにします。 ただデバッガがどうのとか見た気がするのですが。 まあこのレベルでは使わないだろうから別にいいのですが。
複合文に特有な変数なんてものが出てくるほど長い関数書かない人間には関係なかったりする
変数宣言が昔は関数の先頭に限定されていたのは、 そのほうがコンパイラが楽だったからですか? 速度の問題とかはありますか?
コンパイラの実装が楽だったから(コンパイルが高速に行えたから)だろうと思う。
>そのほうがコンパイラが楽だったからですか? そう >速度の問題とかはありますか? 処理がコードを字面どおりに追うならあるかないかの差があったかもしれない でも今のコンパイラならきっと最適化されて同じになる
>>17 ポインタのポインタを使えばいいだけの話
全然難しくねえよww
53 :
デフォルトの名無しさん :2009/01/25(日) 19:11:53
int i = 0; int j = 1; &i = &j; このコードはどうしてエラーになるのですか?
ポインタじゃないから
>>51 &演算子はオペランドへのポインタ値を生み出す。
これは左辺値ではない(代入できない)。
0 = 0; このコードはどうしてエラーになるのですか? と本質的に同じ。
58 :
デフォルトの名無しさん :2009/01/25(日) 19:52:43
0と0だから等号であってるんじゃないのか? なぜエラーにする必要があるんだ? 代入を:=にしたらいいだけだろ。
ここはCスレだ。 Pascalerは巣に返れ
float型の変数をprintfで表示したときに小数点以下の桁数を2桁くらいにしたいんですが、どうすればいいのでしょうか?
%.2f
62 :
デフォルトの名無しさん :2009/01/26(月) 08:35:54
詳しい方が多いようなので聞いてください C言語のリスト構造について僕は疑問があります。 リスト構造の結果をVCのウィンドウで表示してます struct list{ int b; char *str; *next; } この構造体をリスト構造に組み込みました。 *strには、メモリ確保した文字列+ヌル文字が入ってます。 struct list *p; 簡略。メモリにリストを作成 p = head; while(p != NULL){ 簡略 p->next =p; } で結果表示させます。入力数10、表示結果は10個の数字、文字列がでました。 ここから質問なのですが、結果を表示させ、プログラムを終了させず、また同じポインタに別の10個のリストを作成し、同じリスト構造に入れました。 p = head; while(p != NULL){ 簡略 p=p->next; で、また結果を表示。入力10、表示結果は10個の数字。 この後、メモリを開放した場合、僕は使用した20個のメモリ解放すると考えてました。 ですが、結果、開放したのは10個のメモリでした。メモリリークしてないかデバッグしましたがリークしてませんでした。 前部の10個のメモリ部分と、確保した文字列部分のメモリはどうなったのでしょうか?動作が分かる方よろしくお願いします。
64 :
62 :2009/01/26(月) 08:59:01
>>63 // メモリリーク検出
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
僕もおかしいだろと思って終了した際、メモリリーク検出つけたんですけど、引っかからないんですよね・・・
繋がりがなくなったら、検出されないのかな
どう考えてもリークしてます。ええ。
>>62 を読むと以下のような処理に見えるんだけどどう見てもメモリリークです。
ばっちり検出されるよ?
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
int _tmain(int argc, _TCHAR* argv[])
{
_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
int i, *p;
for (i=0; i<2; i++) {
p = (int*)malloc(10);
}
free(p);
return 0;
}
>>62 ついでに、「簡略」という言葉の意味も調べておくといいよ。
>この後、メモリを開放した場合、僕は使用した20個のメモリ解放すると考えてました。 まずここからおかしい。 pが指していたリスト構造を開放せずにpに別の場所を指させてしまったら 古いメモリを開放する手段はなくなってしまう。
69 :
ワカメ :2009/01/26(月) 13:06:07
これって行儀が悪いですか? #define AGE "ヌルポ!" char *p; p=AGE; これでできてしまうから、よくわからね。 char *p; char st[]=AGE; p=&st; これのほうがいいのかな?
上は const char str[] = "ヌルポ"; と同じ それとどっちもpには何の意味もない もっとポインタと文字列ってか配列について学んでは?
どういう神経していればそんなとんでもないことを書けるんだろうか。
>>69 何をしたいのか判らんから、行儀がどうのと言われても判断できんよ。
書き換えが目的なら、前者は言語道断だが。
char シャア
入門書を終えた程度ですが、このレベルでも理解できる 優良なオープンソースのプログラムがあれば教えて下さい。
74 :
デフォルトの名無しさん :2009/01/26(月) 19:20:58
文法さえ把握していればどんなコードも 頑張れば理解できるよ!
ポインタって会社とかプログラム組む上で使うの? やっぱポインタもちゃんと理解しないとだめかな
当然使う 使えて当然
構造体にある文字型配列の要素を削除したいのですが、どうすればよいのでしょうか? strcpy((ptr+player)->name,'\0'); (ptr+count)->money='\0'; これではエラーになっていまいます。
nameとmoneyの型は何?
ptrとplayerとcountの型も聞いておこうか
エラーが出るならエラーメッセージも書けよ。
>>75 正直、使わない(まともな)プログラムが想像できない。
しかし、皆何故ポインタに拒否反応示すんだ? ものすごくシンプルな概念だと思うんだけど。
「難しい」「難しい」って騒ぐから難しいと思い込んでしまってるだけなんじゃないかなぁ。
82 :
77 :2009/01/26(月) 20:40:51
ちょっと追加します
printf("No.%2d:%sを削除します\n",player+1, (ptr+player)->name);
if((player+1) == count){
strcpy((ptr+player)->name,'\0');
(ptr+count)->money='\0';
return ptr;
}
>>78 name:char
money:int
>>79 ptrは構造体のポインタです
playerとcountはint型です
>>80 strcpy((ptr+player)->name,'\0');
この部分で「メモリがreadに〜」というエラーがでます。
'\0'に普通の文字列をいれると動きます
>>82 '\0' の代わりに "" とか "\0" とか
84 :
77 :2009/01/26(月) 20:47:28
>>83 できました。
ありがとうございます。
・・・(゜゜;)なぜ?
>"\0" 愚の骨頂。
88 :
77 :2009/01/26(月) 20:56:51
>>86 charなら'\0'も格納できると思ったのですが。
事実、前作った時は格納できましたし。
構造体になるとまた勝手が変わるのですかね。
>>88 こんなん?
(ptr+player)->name[0]='\0';
文字列として利用するのが目的ならば、""で充分だから。 例えばどこぞのAPIのように、文字列リストを終端させるために必要な場合などはこの限りではない。
>>88 いいえ、あなたは何か勘違いをしています。
92 :
77 :2009/01/26(月) 21:00:27
>>89 あーなるほど。たしかにそうです。
理解しました。
93 :
77 :2009/01/26(月) 21:17:57
すみません、もう一つ聞きたいのですが、 関数から戻ってきたときに要素が削除されたかどうかを確認したいときはどうすればよいのでしょうか? if((ptr+count-1)->name == "\0"){ こうして、最後の要素がNULLになったかどうかで判断しようとおもったのですが、うまくいきません。
>>93 strcmp(ptr[count - 1]->name, "")
or
ptr[count - 1]->name[0] == '\0'
>>93 strcmpもしくは先頭要素と比較
結局何も分かってないじゃん
nameがchar *なら文字通りNULLと比較ができるので、(ptr + count - 1)->name == NULL
ヌルストリングにすることをもって削除とする処理において、ヌルポインタであるかどうかの判定を行って何が得られるのか
98 :
77 :2009/01/26(月) 21:24:35
あー
if((ptr+count-1)->money == '\0'){
これと間違えてました
でも
>>94 さんのやりかたでやってみたいとおもいます。
->この演算子嫌いなんだけど何とかならない?
(*p).member
>>99 ドットで置き換えればいいと思うよ。
pointer->memberは常に(* pointer).memberだから。
むしろ.が嫌いでどうしようもない俺 (&struct)->member なんてやったりはしないけど
104 :
デフォルトの名無しさん :2009/01/26(月) 23:07:43
(* pointer).member ってよく使われるの? この前派遣社員のおっさんプログラマが 使ってたんだけど、 「うちのコーディング規約では認められません」 って速攻却下したんだが。。
>>104 そんなの分からないようなやつがレビューするなよ。
106 :
デフォルトの名無しさん :2009/01/26(月) 23:14:02
わからないことはないけどさ。。 一般的に使われるのかどうか 知りたかったんだよ。 うちの会社にはそういう書き方するひといなかったから。。
そういう風に書く奴は死ねばいいと思う。
わざわざあるものを使わなくする意味が分からない 気に入らないからとか他の書き方するって #define BEGIN { と本質的に何が違うの?
*(array + n) みたいなのも死ねばいいと思う。 array[n] でいいだろと。
>>109 それはポインタ演算の方が高速だと信じ込んでいるロートルがよく書く。
若いのに書いている奴は、入門書か先輩に恵まれなかったのだと思う。
array[n] は *(array + n) のシンタックスシュガーなのにね。 同じものにコンパイルされなかったら処理系は規格非準拠になる。
>>109 この書き方じゃ、古い、最適化のかからなかった時代のコンパイラでも早くならないな。
*(array+n)は使わないが、scanf()の中ではarray + n
配列とポインタを(記法の上では)全く同等に扱えることをわかっている上で ポインタには*(p+n)、配列にはarray[n]を使う人は居るよ。 実際、(pがレジスタ割付されない場合)参照のコストが違うんだから。
>>113 そう書きたくなることもあるが
1要素のアドレスを取るという意味を込めて
&array[n] と書いた方が読みやすいと思われる。
>>114 何を寝言を言ってるんだ。
*(p+n)とp[n]は言語仕様上等価だ。
違いがあったら大問題。
>>116 ポインタに対するp[n]と配列に対するvec[n]は違うのだが、わかってる?
>>117 どう違ってるか言ってみろよ
笑ってやるから
>>114 今時、よっぽどへぼなコンパイラでもない限り、*(p+n)とp[n]で違うコードを吐くなんてありえない。
それと、(*it).memberという書き方は、 昔々にC++を学んだ人の中には居るのかもしれない。 初期のSTLのiteratorは、*だけが保証されていて->に対しての保証は無かったらしい。 標準規格が定められるまでのほんの僅かな期間だろうけどね。
>>118 上で生成されるコードが違うと言っているだろ。
もちろん、そんなのありえないと
>>119 で否定済みだが。
>>114 論点はそこではなく、
ポインタpに対してp[n]と*(p+n)は同じ、
配列aに対してa[n]と*(a+n)は同じ
ってことを言ってるんだよ。
>>117 何ら違わない。
何度も言うが、p[n] は *(p + n) のシンタックスシュガーだ。
pが配列でも例外ではない。
>>117 >>119 お前らは何バカなこと言ってるの?
コンパイラが同等に解釈するなんて、ちゃんと
>>114 にも書いてあるだろ。
>>114 は、『「ポインタ変数に対してのp[n]」と「配列に対してのvec[n]」が違う』と書いてあるんだぞ。
読めるかい?
>>124 分かってたらわざわざ違う表記にしないよ。
違う表記にしている時点で変に理解している。
>>122 だから、「常にp[n]と使う。*(p+n)は異端」という流れに対しての反論だろ。
流れが読めないの?
つまり両者がどちらも、自分が正しいのでおまえが自分で言ってることの根拠を示せと言い合ってるんだね
「ポインタ変数に対してのp[n]」と「配列に対してのvec[n]」が機械語で違うのは確かだが、 それが*(p+n)と使う理由になってないのが笑える。
131 :
122 :2009/01/27(火) 00:33:32
え、なに?
もしかして、
>>109-111 って、配列限定の話かね。
確かにarrayは配列だけど、
>>110 とかが配列限定の話をしているとは、とても思えないな。
一時期、a[b]か*(a + b)かによって、違うコードが生成されるコンパイラがあったのは分かる。
そんとき、aが配列なのかポインタなのかによって、どちらがより良いコードを出すのか違いがあったのも分かる。
だが、そんなもん過去の話だ。それを集約すると
>>110 で済む話だが。
p[n]と*(p+n)で同じコードを吐くのだから 分かりやすいp[n]の方で書くべき。 プログラムは人間も読むものだということを意識してプログラムする事は バグの少ないプログラムを書くのに重要だ。
>>130 参照のコストが違うのを強調するためだろ。
そもそも、
Cで構造体のポインタに対して、後発の言語のように
. によるアクセスではなく
-> という別の演算子を導入したのは何故だね。
文法的には同じ . でもコンパイラは簡単に区別できるのだから
わざわざ導入する必要は無かったのに。
これも間接参照のコストがかかるという点を示すのが理由の一つだとも言われているよ。
昔の計算機は遅かったし、コンパイラの最適化も弱かったからね。
括弧が多いと読みにくいので、より括弧の減らせる形式が好みだな。 *(p+n)よりはp[n] &p[n]よりはp+nが好き。
>>136 そんなの強調されても何も嬉しくない。
読みにくくなるだけ。
>>138 なんでCはC99になってさえ、構造体のポインタのメンバ参照に . が使えないの?
>>139 俺も使えてもいいとは思うが、使えないのだから仕方が無い。
今更 . で出来るようになっても混乱するだけだろ
>>140 では何故 *(x).mem という記法があるのに、 x->mem なんてものを導入したの?
>>142 (*x).mem だろ
こんなもの読み辛いしパースに時間かかるしいい事無いだろ。
(*x).memとか美的感覚を疑う
*が後置だったら良かったのに、と思う。
前置は予め書こうと思って書き始めないといけないし、 読む時も思考を逆行させないといけないからな。 どうしても仕方が無いもの以外は後置で書きたい。
そもそも、ポインタなんだから、増減して使うのが当たり前なのに *(p+n)は無いわな。 その点ではp[n]だって全く同じだがね。 関数の仮引数でポインタ受け取って、添え字でアクセスなんてバカもいいとこ。 まあ初心者スレならその方が良いかもしれないけど。 ただ、p[n]は配列(=pは変化しない)に見えるから、pが変化するときは*(p+n)もありかもね。
p*.mem pp**.mem p**n ←(p*)*n これもちと辛いかも、パースが。
(*(*(*x).a).b).c vs x->a->b->c
>>142 は前者が好きなようです
>>143 だから、そういう理由があるのに、何故 . という記法を採用しなかったのか。
別な方がコンパイラ作るの楽だし。
コストを明示することも必要、という考えがあった可能性はあると。
ないない。 そんな考えがあったら [ ] で配列とポインタを同じように扱えるようにしないって。
スレ違いではあるけどC++もあることだしもうむりだろ.にするのは
C++だとオーバーロードが絡むからな。
>>151 えー、どこが。
それこそ、p[n]と*(p+n)を別にすべきってことじゃん。
×別にすべき ○別にしとけばよかった
>>156 作り辛くしてでも分かりやすくしたかったんだろう。
. でいいんじゃね? ということに当時の人が気付かなかった可能性も
もう寝る
願わくばうちの会社に
>>114 が来ませんように
>>160 大丈夫。わざわざITドカタになるってわかってるところへ就職を希望する人なんて、
この不景気でもそんなには居ないでしょ。
素人宣言ktkr
>>162 は、皮肉という言葉を知らない、日本語の苦手な人
>>166 理解できなかった事を今更誤摩化そうとしても遅いよ
>>163 ポインタは p++ したり *p したりするべきものだ、
と言ってるんだろう。
たとえどんな時でも。
ばからしい話だが。
>>163 おまえ、関数の引数にポインタ渡したことないの?
それとももしかして、1関数300行くらいにして、全部関数内で処理してるの?
(flg ? struct : ptr).member とかやってもいい?
釣りが増えて来たな
そんなことより純粋に知りたいのですが参照のコストが違うとはどういうことですか?
>>169 >そもそも、ポインタなんだから、増減して使うのが当たり前なのに
がおかしいって、mallocっていう反例を示して指摘してるのに、なにが言いたいの?
>>172 ->は参照先アドレスが実行時に決まるのに比べて、
. はリンク時に決まるってこと。
>>174 構造体を持つ構造体を、mallocすること考えただけでもそれはありえなくないか?
>>176 ポインタpの指すアドレスは実行時に決まるのに比べて、
配列arrayのアドレスはリンク時に決まるってこと。
pがレジスタに割り当てられたら差はないし、 インライン最適化されれば配列そのものが使われるかもしれない。 コストを明示したつもりでも、実際コストに差はないかもしれない。 そんなあやふやな意味の無いものを明示する暇があったら もっと分かりやすく書け。
いや、まじめな話、「一般的には」だけれど、 関数内だけで使うローカルな領域をmallocすることなんてそんなに多くないでしょ。 多くは、構造体のメンバとかに置いて、外部とのやり取りに使うためのもの。 だから、後でfreeするための元のアドレスはそのメンバが持っていて 個々の関数ではその値のコピーを使って操作することの方が多いでしょ。 いや、(コピーじゃなくて)直接使うケースが少ないとは言わないけどさ。 で、まあ、確かにローカルで使用するにしても 不定長のバッファなんかは必要ではある。 ただ、この用途は(C++で済まんが)vectorばっか使ってるから malloc(operator new)することなんか殆ど無いし。 特に、配列として確保したもの(1個のオブジェクトではなく)は ループを回したりするわけだから、コピーしてレジスタ割付なんかも期待したいところ。 そんな変数を増減するのは、ちっとも不思議じゃなく当たり前の話じゃないかね。
>>177 簡略化した説明なので、そこまでは勘弁ね
>>178 それは配列とポインタの違いであって*(p+n)とp[n]の違いじゃないと思うんだが
>>176 配列(の先頭アドレス)は「定数」だから、コンパイル時に決まる。
それがグローバルかスタックフレームの相対アドレスか構造体内のオフセットかはともかく。
一方、ポインタは「変数」だから、(レジスタ変数にされない限り)メモリを読み出して
その値を得、それにオフセットを加えて参照先を決定する必要がある、ということ。
>>183 C99ではそうではないとか言い出してみる
>>182 日本語力の無い俺には
>>114 をよく読むほど意味がわからなくなってきたw
少なくとも、*(p+n)とp[n]には見た目以外の違いは何も無いよ。
>>174 つーか普通に関数呼び出しの時にアドレス決まるんじゃないの?
グローバル変数以外
「ポインタなんだから、増減して使うのが当たり前」っていう極論が否定されてるだけで、 増減すること自体は誰も否定してないだろ。
191 :
174 :2009/01/27(火) 01:34:09
なんか突っ込みが多いので訂正するよ! ->は. より間接参照が1回多い分コスト高だってこと。
配列に添え字(変数)でアクセスしようが、 ポインタでアクセスしようが一緒。
>>190 何言ってんだ。
後で触れているという点は除くにしても、話の流れ的に
p[n]や*(p+n)として使うくらいなら、pを増減する方が普通ということだろ。
特にわざわざそのためだけに添え字変数を用意するくらいなら。
もちろん、配列として確保したメモリ限定の話な。
>>188 その点を否定している人は誰もいないと思われます。
>p[n]や*(p+n)として使うくらいなら、pを増減する方が普通ということだろ。 ね え よ
>>191 そりゃ (* hoge).なにか
と等価なんだから当たり前だろ・・・・・・・
違いがあるのは配列とポインタであって[]と*(+)ではない 手に持ったゴミを焼却炉に放り込むときに「燃やす」、 ごみ箱の中身を放り込むときに「焼却する」と言い換えてるようなものだ
じゃあ、ポインタ経由のインデックスアクセスと、配列からのインデックスアクセスで コストが違うこともわかってますよね? それと、p[n] と *(p+n) は全く同じ、ということをあわせて 敢えて違うということを明示するという意図(それに意味があるかはともかく)もわかりませんか?
>敢えて違うということを明示するという意図(それに意味があるかはともかく)もわかりませんか? だからそれがバカなこと以外の何物でもないとずっと言ってるんだろうが
>>203 コーディングした人の好みの問題ですよね、わかります。
Q. ポインタは本当に配列より高速なのか。 A. たいていは大きな配列の中をアクセスしてまわるのにポインタを使うほうが、 配列の添字を使うより高速であるが、その反対のプロセッサも存在する (よくできたコンパイラならどちらの記法を使って書かれたコードにも 良質なコードを生成すべきである)。 CFAQ 20.14
>>190 単純な増減だけでしかアクセスしないんならそれでもいいかもね。
int (*a)[1000] = malloc(sizeof(int) * 1000 * 1000); としたとき for (i = 0; i < 1000; ++i) for (j = 0; j < 1000; ++j) a[i][j] = i * j; より for (i = 0; i < 1000; ++i) for (j = 0; j < 1000; ++j) a[j][i] = i * j; のほうが遅いらしいんですがなんでですか?
だからね、俺も(バグってるかどうか知らん) char *strcpy(char *dst, const char *src) { char *top; while (*dst++ = *src++); return top; } なんてのが「普通」「読みやすい」なんて全然思わない。けど、 char *strcpy(char *dst, const char *src) { char *top = dst; while (*src) { *dst = *src; ++src, ++dst; } *dst = '\0'; return top; } のような使い方のほうが char *strcpy(char *dst, const char *src) { int i; for (i = 0; src[i]; ++i) { dst[i] = src[i]; } dst[i] = '\0'; return dst; } よりも「普通」だと言いたいわけよ。 もちろん、この場合に速くなるなんて思わないけど(レジスタ変数が2つまででなければ)。
ぶっちゃけ処理速度を要求されてるわけでもない場面で雀の涙ほどの高速化を計るより 統一的で読みやすいコードを書いてほしい
>よりも「普通」だと言いたいわけよ。 条件の後出し乙
>>208 右側の[ ]の添え字を1ずつ動かしたものは、メモリ上連続しているので、
キャッシュメモリの効果が出やすい。
左側の[ ]を動かすと、メモリのあっちこっちに飛んでアクセスすることになるのだ。
配列を順番に舐める程度の使い方しかできないのはわかった。
>>209 さすがにそのレベルだとどれでも読みやすさに大差ないだろ
ポインタ演算にしたせいで糞読みづらくなるのはもっとさぁ
>>209 i 消滅させてくれたはずなんだよなぁ、コンパイラさまの力で
ソース出せといわれても困るけど
>>212 ありがとうございます
説明にくわえ、キャッシュメモリという単語をもとにおおむね分かりました
どうもありがとうございます
>>209 どう見ても特殊な状況だけを取り出して「普通」ってw
配列の使い方がそんな単純なものだけなわけねーだろ。
>>204 あれ、
>>114 の言っていることがわからないって言ってた(
>>188 )んじゃなかったの?
じゃあ「
>>114 の意味がわからない」なんて書かないでよ。
せめて「
>>114 は無意味としか思えない」とかにしてよ。
すげー時間無駄にしたよ。
本当に日本語苦手なんだろうけど
「日本語が苦手なんですけど」と書き出されても
「初心者ですけど」と言って質問する人と同じように応対すべきとは思わないじゃん。
>じゃあ「
>>114 の意味がわからない」なんて書かないでよ。
俺はそんなこと一言も言ってない
ID出ない板で勝手に特定の発言を同一人物だと思わないこと
>>114 が無意味なことしてるとは思わなくて、*(p+n)とp[n]に何か違いがあるのかも、
って思っちゃったんじゃね?
そんな無意味なことをやる人間がプログラマ名乗ってるとは信じがたかったとかそういういわゆる一つのアレだろ
>>218 いや、
>>114 はポインタと配列のコストの違いと言っているのか、
*(p+n)とp[n]のコストの違いと言っているのか、どっちなのかわからなかったのだ。
あと、
>>204 は俺じゃないよ。
いずれにせよ、ごめんね。
スレも無駄に消費してごめんなさい。
これが単なるスタイルの問題ならここまで紛糾しなかっただろう しかし常に*(p+n)と書くというのはあまりにも迷惑すぎる
どこに「常に」と書いてある?
「常に」とは書いてないが、ポインタなら常に*(p+n)って書くんじゃね?
>>228 常にでないならその無意味な意図とやらすら成立しないだろう
>>228 ポインタと配列が違うことを示すために変えて書いてます!
ってやつが常にそうしないなら逆に大笑いだ
文脈が読めず「常に」と書いてなければ常にじゃないってw
ポインタなら別のどこかでインクリメントとかする事があるんで。
別にわからなくてもいいよ。
そんなにポインタと配列を混同しやすくて困るってんなら プレフィクスでもなんでもつけたほうがまだマシってものだ
劣勢だから話題をそらしたいんですね
デバッグ作業にかかる時間を短くするために心がけることってどんなこと? 時間かかりすぎる
>>238 迷惑すぎる。
*()を使って(2文字増やして)得られるものが何一つない。
ちなみに[]と*()は実は記述上完全な同等ではない。
演算子の優先順位が[]のほうが高いからだ。
ポインタと配列を区別したいなどという理由で*()を押し通していると、
(*())とさらに一つ余計な括弧をつけなければならない場面が出てくる。
ふまえると、関数に配列を渡す場合にポインタを渡すか、配列そのものを渡すかで 関数内の処理速度に影響があるということ? 配列を渡すと、渡す際のコストは大きくなるけど、関数内の処理は速くなる?
p[3]や*(p+3)は オK だが int *p,q p[q]は問題無いが、*(p+q)は迷惑。p[q]じゃないと殴りたくなる というか、後世に継承してもらうのは無理と思って欲しい。 ちなみにC++では Class *p( operator[](int)が定義澄み) p[2] はコンパイルエラー (*p)[2] この書き方じゃないとNG p->[2]なんて書けない。 void *p p=(void*)(p+3);はコンパイル可能だし警告もおそらく出ない。 p=&(p[3]);は警告が出る筈。 (処理系によってはコンパイルが通らない場合がある。) こういった微妙な相違はあるな。
>>241 たとえば、
struct foo { bar_t bar; };
struct foo foo_array[4];
struct foo *foo_ptr_of_array[] = {foo_array, foo_array+1, foo_array+2, foo_array+3};
struct foo *(*ptr_to_foo_ptr_of_array)[] = &foo_ptr_of_array;
struct foo *(*ptr_to_ptr_to_foo) = foo_ptr_of_array;
foo_ptr_of_array[0]->bar = barFoo;
(*ptr_to_foo_ptr_of_array)[0]->bar = barBar;
(*(ptr_to_ptr_to_foo + 0))->bar = barBaz;
さすがに最後はないだろうとは思うけど。
私は、配列なら添え字演算子を使い、ポインタなら間接参照を使うので、
この場合は、2番目を選ぶと思う。明らかに、最後のは、配列をポインタに成り下げているから、嫌だ。
配列は配列。ポインタはポインタです。混同するのはよくない。
ポインタに間接参照を使う理由は、関数の引数やローカル変数が、間接参照をされている場合、
ポインタなので(+1)、それなりの注意をして読んだり書き直したりできる。
たとえば、NULLポインタチェック、アロケートとフリーの対応、リテイン(他のポインタが、同じアロケート先をさしていないか)チェックなど。
(+1 配列もポインタに成り下がれるけどe.g. sizeof(array)/sizeof(*array)当然私は、sizeof(array)/sizeof([0])のほうを使うけど)
>>244 C++の例なんかむちゃくちゃ言ってるぞwwwwww
base pointerとindexの両方を1つのコンテクストの中で動かす 極めてアルゴリズム的ななコードはそれが公共的なものである 場合、修正加筆し損なって、破損した場合の影響度を考えると最早書け ないと思ったほうがいいかもな。
>>245 混同したくないなら名前を変えりゃいいだけだろ。
そんな汚い表記で迷惑かけるのはやめてくれ。
読み辛さに起因するバグと相殺しそうだ。
>>248 「混同したくない」ではなく「混同するな」といっているんだが。
たとえそれが糖衣構文とはいってもポインタをあたかも配列のように扱うのはプログラマの意図すべきことではない。
間違ったコードが間違って見えるように、ポインタを配列のように表記せずにはじめから間接参照を使うほうが、
プログラマの意図を反映したコードになる。
配列は、固定長のデータやデータ長が既知であるとき、動的メモリ確保に制限があるとき(マシンの構造上、動的にメモリを確保できない)、
そのほか小手先技の実現のためなどに使えばよい。だからこそ、ポインタと配列は、別の表記をしたほうがよい。
配列は、線形的なデータ構造を作るための安価な複合型
ポインタは、柔軟なデータ構造を作るための安価な複合型
>>汚い表記
どこが汚いのかまったく理解できない。
自分にしか読めないようなのは他人から見ると汚いんだよ
>>250 言いたいことはまぁ判ったから、もう少し判り易い例を提示してくれ。
>245だと何が言いたいのか全く判らん。
>>252 配列のように連続性に意味のあるデータは [] 使えよっていう話では?
>>250 宗教の話がしたいなら、ニッポン放送の朝5時から勝手にやっててくれ。
間をとって 0[p+n] と書けばいいよ
>>250 >たとえそれが糖衣構文とはいってもポインタをあたかも配列のように扱うのはプログラマの意図すべきことではない。
完全に間違っている。
君がどういう印象を持つかにかかわらず、[] は配列を操作する演算子ではなく、ポインタを操作する演算子である。
ポインタに対して [] を作用させるのは言語仕様上まったく正当で、また配列はポインタに成り下がるから、
配列名に対して [] を作用させるのも同じ理由で正当である。
重要なことは、ポインタの指す場所以降の領域がいかなるものであるかということであって、
識別子がポインタであるか配列であるかではないし、それに対してどんな演算子を使用するかでもない。
そこまでして識別子の種類を明示的に区別したいなら、ハンガリー記法でも使うことをお勧めする。
257 :
デフォルトの名無しさん :2009/01/27(火) 14:27:54
教えてください。 borlandC をコマンドラインで使っています。 実行ファイルへプロパティのバージョン情報タブを付けたいのですが、 どのようにしたら良いですか?
なんとなくわかった気がするぞ たぶん配列とポインタで[]の意味が変わると思ってるんじゃないか? でなかったら >明らかに、最後のは、配列をポインタに成り下げているから、嫌だ。 なんてセリフ出るはずがない その例では三つとも全部配列はポインタに成り下がっているのに
宗教戦争ってこわいな
参加者乙 傍観する分にはそうでもないよ
>>>たとえそれが糖衣構文とはいってもポインタをあたかも配列のように扱うのはプログラマの意図すべきことではない。 >>完全に間違っている。 だから、意図的にやるなといっているんだよ。 >>君がどういう印象を持つかにかかわらず、[] は配列を操作する演算子ではなく、ポインタを操作する演算子である。 >>ポインタに対して [] を作用させるのは言語仕様上まったく正当で、また配列はポインタに成り下がるから、 >>配列名に対して [] を作用させるのも同じ理由で正当である。 正しい。配列名が、ポインタに成り下がることは、前にも書いた。私もよく使う。 そうではなくて、ポインタを配列と認識することに問題があるといっている。 foo_t bar(baz_t *baz);とfoo_t bar(baz_t baz[]);という宣言について考えよう。 前者は、明らかにポインタを引数としている。後者もポインタを引数にしているが、そのポインタは、配列の成り下がりというのを明示している。 ここで、後者に対して、関数定義をしている実装コード内で添え字演算子を用いることについては、間違っていない。 前者に対して、関数定義をしている実装コード内で添え字演算子を用いることについては、 間違えとまではいわないが、それを目にしたときには首を傾げるだろう。 はじめから、後者の書き方を採用すべきだ。 >>重要なことは、ポインタの指す場所以降の領域がいかなるものであるかということであって、 >>識別子がポインタであるか配列であるかではないし、それに対してどんな演算子を使用するかでもない。 そのとおり、シーケンシャルな場合でないと添え字演算は成立しない。 関係ないけど、"bar"[i], (cond ? bar_ary : bar_ptr)[i]こんなのは見たくない。 シーケンシャルなデータ構造で解決できればいいんだけど、そうでない場合に、ポインタが絡む。 だから、あえてポインタに間接参照演算子を使い、添え字演算子を避けている。防衛的にプログラミングしているってことね。 >>そこまでして識別子の種類を明示的に区別したいなら、ハンガリー記法でも使うことをお勧めする。 使ってます。システムハンガリアンね。lint病にかかったのかなぁ。
>そのとおり、シーケンシャルな場合でないと添え字演算は成立しない。 添字演算が成立しないのに*(+)はつかっていいのか バ カ じ ゃ ね え の
>>261 > そうではなくて、ポインタを配列と認識することに問題があるといっている。
あるだろう。しかし、ポインタに対して [] を使わないというルールではそれは解決しない。
もしあるポインタ識別子を正しくポインタとして認識しているなら、[] を使っても問題ない。
もし誤って配列として認識しているなら、それは結局 [] を使ってしまうことになる。
もう一度問う。敢えて p[n] を押しのけて *(p+n) を使うことにどんな意味があるのか。
ポインタ演算の結果を参照することはシーケンシャルなメモリアクセスを行うことにほかならない。
それに配列名でアクセスしようと、ポインタでアクセスしようと、領域の持つ意味はまったく同じである。
int main(void) と言うように、main関数の戻り値はint型、引数がないならvoidを入れとけ C++では、int main() でもおk。引数があるなら、int argc , char *argv[] ってんだ、分かったか? みたいなw ただの標準”スタイル”だけどなw
君のレスなんて読まないよ
っと、読まない宣言をしないと気がすまない基地外、構ってチャンが申しております
リンゴを食べるときはフォークを使いなさい ナシを食べるときは爪楊枝を使いなさい なぜならリンゴとナシは別のものだからです ちゃんと区別しなければいけません これぐらいアホなこと言ってるのに気付いてないのか
カレー味の●ンコが良いか、●ンコ味のカレーが良いか?なんて聞いているお前が言うと笑えるw カレー味のカレーを作ってくれよ?単純だろ?w
>>261 ついでに。
もし君が、識別子の素性が容易には突き止められないようなコードを書いているなら、
間違いなくそちらのほうが問題である。
自分のコード読解力の低さを棚に上げて無意味なスタイルを押し付ける前に、
あらゆる処理構造を可能な限りシンプルに書くように勤めたほうがよい。
君のレスなんて読まないよ
実行ファイルが使ってる関数のアルゴリズムとかを調べるにはどうすればいいの?
>>271 デバッガで実行中のプロセスにアタッチして逆アセンブルリストを眺める。
勉強用にcatというプログラムを読もうとしていますが 軽く300行を越えている関数がありますが、普通ですか?
異常
g++でエラーがどうすれば・・・ #include<iostream> using namespace std; { int val; cin >> val; cout << val << endl; return 0; } こんなかんじでエラーメッセージは cin.c:6: error: expected unqualified-id before '{' token
>>277 int main(void)
でも追加してみるとか
一体何を参考にそのコードを書いたのかが気になる
最近は、入門書とか買わないで勉強してんのかね。
281 :
デフォルトの名無しさん :2009/01/28(水) 01:33:43
質問です。 1、式は必ず評価値を持つのでしょうか? 2、関数呼び出しは、値を返す時だけ式なのでしょうか? それとも戻り値の無い関数の呼び出しも式なのでしょうか?
>>277 これネタだよな?
突っ込み所ありすぎてワロタw
>>281 1、ない場合もある
2、値がなくても式は式
プログラムがクラッシュします。なぜでしょうか?1時間ほど考えた けど理由がわかりません。 int main(void) { char *p = (char *)0x5000000; memset(p, 0, 0x10000000); return 0; }
0x5000000番が書き込めないとこだったんだろう
ありがとうございます。 素直にmalloc()使います。
>>284 memset(p,0x10000000,0);
の間違いだったんじゃないのか?
これを使ってscanfで「2進数の1010」と入力して出力すると「10」にならないで「730」になる どうしてだろ・・・助けてください //n進数の○○○○を10進数に変換してその値を返す関数 int decimal(int sinsu,char hairetu[21]){ int i=0,wa=0; while(hairetu[i] != '\0'){ wa = wa * sinsu + hairetu[i]; i++; } return wa; }
>>289 まずは「2進数の0」と入力すると結果が48になるバグを直すんだ。
>>289 hairetuが文字列なのに
hairetu[i]を文字から数値に変換してない
>>290 なるほど!!
ASCIIコード表ながめてもう少し考えてみたいと思います
助かりました!!
人に自分のプログラムのミスを見つけさせるのは、相手の 精神を損傷させかねない、実は非常に罪作りな行為だよ。 聞いた話にすぎないが、メンヘル自殺者のトップレベルに 常にランクインする職業は、「校正」らしい。 おそらくプログラム関係だったら「テスト作業」関係者も ランクインしてるんじゃないかと...
>>293 コーディングやバグフィックスは寧ろ楽しい。
一番嫌なのは人に仕様を聞いたりしなきゃならない作業。
コミュニケーションがなくなればマは最高だとおもう。
機械向け言語通訳/翻訳作業従事者とプログラマの間に横たわる (余りにも深〜〜い)ギャップについて
>>295 「楽しい」と感じること自体に大きな罠があるような....
マイコン用のソースを考えているのですが float型(32ビット)の変数から10進での小数点以下1桁、小数点以上最大3桁の計4桁を 桁ごとに切り分けるにはどのように記述したらいいでしょうか? 因みに特に使えそうな関数は用意されていなくANSI Cの範囲で記述する必要があります
>>298 マイコンのアーキテクチャがわからんけど
10倍して固定小数点の整数型にして扱うってのはだめかね?
sprintfで文字列化して1文字ずつ取り出すってのはどう?
301 :
デフォルトの名無しさん :2009/01/28(水) 17:56:37
#include<stdio.h> void inputdata(void); void outputdata(void); int *data, numData; main(){ printf("Enter number -> "); scanf("%d", &numData); data = malloc(numData * sizeof(int)); inputdata(data); outputdata(data); } void inputdata(void) { int i; for(i = 0; i < numData; i++){ scanf("%d", &data[i]); } } void outputdata(void) { int i; for(i = 0; i < numData; i++){ printf("data[%d] : %d\n", i, data[i]); } } 引数の数が合わないらしいんですけど どこをどう直せばいいのでしょうか?
void inputdata(void) → void inputdata(int* data) void outputdata(void) → void outputdata(int* data)
>>298 int型に代入したら、小数点以下が切り捨てられる。あとは
304 :
301 :2009/01/28(水) 18:11:50
>>302 コンパイルできました
ありがとうございました
>>298 sprintf(str, "%5.1f", floatValue)
306 :
デフォルトの名無しさん :2009/01/28(水) 18:44:29
#include <stdio.h> int main(void) { int i, j, prime; for (i = 2; i < 1000; i++) { prime = 1; for (j = 2; j <= i / 2; j++) if (!(i % j)) prime = 0; if (prime) printf("%d は素数です\n", i); } return 0; } 素数を求めるプログラムが理解できません。特にif (!(i % j))は どういう意味なんでしょうか?
i を jで割ってそのあまりが0ならば、
真偽値でないものに ! を使うのはキモいなあ。 よく見かけはするけど。
!がついてる == 0ならば と刷り込まれてるのか違和感は感じないな
310 :
306 :2009/01/28(水) 19:06:17
なるほど論理演算子を理解していなかったです。 0なら素数ってことですね ありがとうございました
余りが0でないとき素数だ
312 :
306 :2009/01/28(水) 19:19:19
あ!そっかw 二番目のループは割り切れる数字があるか探しているのか ありがとうございます!!!
何がおかしいのかわかりません。 #include<stdio.h> void inputdata(int *, int); void outputdata(int *, int); main(){ int *data, numData; printf("Enter number -> "); scanf("%d", &numData); data = malloc(numData * sizeof(int)); inputdata(data); outputdata(data); } void inputdata(int *dt, int num) { int i; for(i = 0; i < num; i++){ scanf("%d", &dt[i]); } } void outputdata(int *dt, int num) { int i; for(i = 0; i < num; i++){ printf("data[%d] : %d\n", i, dt[i]); } }
何でおかしいのがわからないのかわかりません。 エラーメッセージくらい読めよ。
>>313 とりあえずどういうプログラムにしたいか教えてくれ
>>315 値の概念の話であって
真偽型の話じゃないぞ
奴らは隙を見せると即座に噛み付いてくるからな
多分昔雑誌か何かで見たクイズだと思うんだけど ■ int n; ■に出来るだけ多くの文字を入れよ。ただし、 ・全体として正しいnの宣言でなければならない。 ・意味の変化を与えないものを入れたり、繰り返したりしてはならない register const volatile unsigned long long int n; で合ってますかね?
malloc ってstdio.hで宣言されてたっけ?
>>321 ちょっと考えてみる限りは、標準の範囲内ではそんなもんだと思う
>>322 stdlib.h
ちょっとまてもし標準ならlong longはだめだろう あと意味が無いものがアウトなら long int と long は同じだな
>>322 malloc.hかstdlib.hじゃないの
malloc.h とか非標準
>>324 long long はC99 標準
int は略せない
多態性って関数ポインタの配列なんですね
c++のこといってるなら、そんな単純な実装じゃない
>>331 C++的なやつはそうだね。
メッセージングとか言っているやつだとまた違う実装もあり得る。
C++だと基本的に仮想関数テーブル使ってるだけだと思う。 多重継承するとオフセットとか効いてくるけど。
>>313 >inputdata(data);
>outputdata(data);
を
inputdata(data, numData);
outputdata(data, numData);
にする。
freeくらいしろよ
>>319 その理論だと真偽値以外のものに!の件が理解できなくなるんだけど、
何ならおk?
それは動かない理由じゃないし。
真が0以外で偽が0なんだから、数はすべて真偽値だということもできる。
>>337 日本語でおk
真偽を意味している値を真偽値と呼んでいるだけ。
比較の結果だとか isupper の戻り値だとか
そういうのを入れた変数とかそういうもの。
自分定義で語られてもw
最近の言語は条件式に真偽型の値しか受け付けないのが主流だぞ
343 :
313 :2009/01/28(水) 21:08:17
>>340 くだり、と読んで。
てことは、具体例として、ヌルポインタかどうかの比較に!は気持ち悪いと?
>>342 C言語のスレで最近の言語がどうとか、頭大丈夫?
そういうのが主流になったってのは 条件式には真偽値以外使うべきではないという プログラミングスタイルが そういう言語が作成される前に確立したからだよ
C/C++由来の言語のほとんどが真似しない悪習ということだな
初歩的なことですいませんが 1+4+9+16+…… と加えて行き、和が初めて10000を超えたとき、その和の値、および最後に加えた 数を求めて表示するプログラム #include<stdio.h> #include<conio.h> void main(){ int x=1,S=0; while( )←ここに入る式と { }←ここに入る式がわからないのですが printf("和の値は%dで、".S); printf("最後に加えた数は%dです。\n",x); getch(); } お願いします
宿題は自分でやれ
かといってCでif (hoge == TRUE)等と書くのは愚の骨頂であるわけだし
hoge が真偽値なら if (hoge) と書けばいいじゃないの
結局どのような使い方がいやだったの?
if (!(i % j))
if(!i%j)
if (!p)
別にキモイと感じるのは自由だよ それが常識だと思い込んだり他人を批判しだしたりすると問題だけおで
if (!strcmp(s, t))
if(hoge == TRUE)と書くべきだと主張する奴は if((hoge == TRUE) == TRUE)となぜ書かないのだろう どうしてif(((hoge == TRUE) == TRUE) == TRUE)と書かないのだろう
>>358 今のところそれを主張している人はいないように思うんだけど
>>350 Cじゃなくても、そんな書き方しないだろ。
361 :
デフォルトの名無しさん :2009/01/28(水) 23:09:03
かっこ付けようとしてダサいのは痛恨だなw
ただのよくあるネタだろ
そもそも TRUE と比較はマズいという点にも突っ込みを入れた方がいいのかな
FALSEとの比較ならよさそうな口ぶりだな。
TRUE よりはマシ 嫌いだが
FALSEとの比較は常に期待した動作になるけど TRUEは必ずしもそうとは限らないからな どっちにしろキモいとは思うが
言語仕様的には意図した結果が得られさえすればいいし 一般的には意図した結果が得られる限りにおいてもっとも短く記述できるのがベスト
意図を字面から読み取れる読みやすいコードを描こうな
369 :
デフォルトの名無しさん :2009/01/29(木) 00:06:36
int aho; /* グローバル変数 */
短くって言うか、読みやすさだろ。 if (success) ・・・ なら、素直に成功してるって読める。 if (success != false) ・・・ とか、やめて欲しい。 今日、↓みたいなコードを見たけど、 len = strlen(s); if (len) ・・・ こういうのはふつーに if (len > 0) ・・・ と書いてほしい。
意味が変わっとるがな
lenは符号無しのsize_t型なんだろう。
>>370 で、if (len)よりはif (len > 0)がいいというのと同じように、
俺はif (!(i % j))よりif ((i % j) != 0)がいいと思う。
スタイルの話は宗教論争 少なくともこのスレでやるような話じゃない
i % j に括弧は要らんだろう
あっても害にはならない
見辛いという害がある
逆引きみたいな解説書ないですか? つまり、たとえば 2ちゃん専用ブラウザのソースが全部載っていて、 この命令文はどういう命令文で、この部分はあとのアノ部分に つながるわけで、、、とかいうことが全部解説してあるもの。 そして初心者が見ても理解できる内容に仕上がっているものです。
駅前一等地で一階がコンビニの格安マンションなんて無いよ あったら疑え
ドキュメント作成ツールに食わせる
あるよ 予算より随分安かったから2物件買った
381 :
デフォルトの名無しさん :2009/01/29(木) 04:35:07
C言語のまま,擬似的にc++のようなclassなどを作る方法があると聞いたのですが どんな方法なのでしょうか? boost.PPも使えるとか
383 :
デフォルトの名無しさん :2009/01/29(木) 12:42:13
381です. cygwinのdefaultのg=++からMinGWのg++に変更したらあっさり解決しました. Vistaが原因なのかcygwinが原因なのかはわからずじまい.
進学のために名古屋に行く事になったのですが、プログラミングに関する書籍が多い書店を教えてください。絶版書とか
スレ違いにもほどがある
388 :
デフォルトの名無しさん :2009/01/29(木) 14:54:01
再び質問です。 Borland C++で、exeファイルにバージョン情報を入れたいんですが、 入れ方を教えてください。
389 :
デフォルトの名無しさん :2009/01/29(木) 15:07:25
変数 "VERSION XXX" みたいな内容を含む変数を挿入する。
?入門者ならば必須だろ?そういう知識は。 初心者はやらなくても許されるかも知れないが
bcc++ってバージョンリソース埋め込まないの?
C言語をテーマに川柳を作ってください
C言語 なら俺に聞け 入門篇
>>391 必要ない。
CにはCの流儀というものがある。クラスを使いたいならC++を使えばいい。
実行ファイルの埋め込み情報はファイルシステムの問題であってC言語とまったく関係ない。
ファイルシステムの問題じゃないでしょ
397 :
デフォルトの名無しさん :2009/01/29(木) 20:04:15
ファイルシステムの問題かも知れないし
実行イメージのフォーマットの問題かも知れないし
>>389 のような埋め込み方しか出来ないかも知れない。
いずれにしろスレ違い。
>>257 ggrks
それでもわからないならwinver
ググレカス 英語でいえば ググルは友達
字余りすぎ
lineに"523,534,234,54\0"と格納されている状態で sscanf(line,"%d,%d,%d,%d,%d,%d",&x.a, &x.b, &y.a, &y.b); で構造体のx.a,x.b.y.a,y.bに整数を入れたいんですがうまくいきません どこか間違ってますか?
上手くいかないというのは、もっと大きな数字が代入されてしまうということです よろしくおねがいします
すいません、上手くいきました
うまくいかない最小のソースコードを書いてみてください
C言語の入門書に ・次の3つは同じなのです &str[n] pstr + n &pstr[n] と書いてありました。真ん中と下が同じなのは解ります が、どうして上も同じなのですか?
>>410 strとpstrがどう宣言されてるか見ないと分からない。
char str[hoge]; char *pstr = str; ならそうだろうね
413 :
デフォルトの名無しさん :2009/01/30(金) 00:26:32
真ん中は違うだろw
>>411 pstrは恐らく配列で宣言されたものと思われます。
strも配列で宣言されたことを前提かと・・・ん〜
唐突に次の3つは同じものと書かれていたので混乱しています;
>>412 ご解答ありがとうございます。
416 :
410 :2009/01/30(金) 00:47:44
やはり
>>412 さんの
char str[hoge];
char *pstr = str;
のように宣言されていなければ
同じではないという解釈で大丈夫ですか?
どう宣言されたかも書かれていないので
それ以外思い浮かばないのですが・・・
変数名を見る限りは char str[hoge]; char *pstr = str; を意図しているようには見えるけどね。
418 :
デフォルトの名無しさん :2009/01/30(金) 01:12:17
どなたかR言語わかるかたいらっしゃいませんか〜
>>417 言われてみると、確かにそれを意図しているように見えますね
それなら納得できます
ありがとうございました
void fil2a(char *name, char *tel) { printf("氏名を入力: "); gets(name); printf("電話番号を入力: "); gets(tel); } これを実行すると 氏名を入力: 電話番号を入力: ↑のようになってしまって、後ろのgets()一回しか実行されなくて困っています。 氏名を入力: 電話番号を入力: というように二回gets()を実行するにはどうすればよいのでしょうか。
421 :
420 :2009/01/30(金) 02:38:15
ひょっとして前の関数でscanf()関数を使ってるから?wikiによると、 「scanf で呼ばれた直後に gets を呼ぶと入力ストリームの先頭に改行文字が残っているため gets は空の文字列を返してしまう」 ということらしいですが・・・。 これを書きながらいろいろやってる内に一応目的の動作はするようになったのですが、 下のようなやり方は、果たしてよいものなのでしょうか? void fil2a(char *name, char *tel) { printf("氏名を入力: "); gets(name); gets(name); printf("電話番号を入力: "); gets(tel); }
よくない。 何が良くないかというと、getsを使うことが良くない
423 :
デフォルトの名無しさん :2009/01/30(金) 02:46:07
そのプログラムを動かすだけならそれでいいけど、 fil2a()が呼び出された時点でストリームに改行が残っていないと期待通りに動かないのでは? 他の場面でfil2a()を呼び出すときも、それを忘れないようにしないとね。まあgets()使わないのが望ましいけど。
どのくらい良くないかというと、gccでコンパイルした時に以下の警告が出るぐらいに良くない。 warning: the `gets' function is dangerous and should not be used.
>>418 数学板の統計スレ行け。
あっちにいる。
426 :
420 :2009/01/30(金) 03:12:37
レスありがとうございます。 ここまで危険視されているとは、まさにgets()恐るべしといったところです。 練習もかねて、scanf()関数で文字列の読み取りを行うようにしてみます。
427 :
デフォルトの名無しさん :2009/01/30(金) 06:25:07
statでファイル情報を取得して、そのファイルサイズをa.st_sizeとしたときに ファイルサイズを小さい順に並び変えたいのですが、その場合ってどうしたらいいんですか。 普通にqsortとか使っていいんですか。
>>427 遠慮なく使ってやってください。
>>426 scanf()でもいいけれど、fgets()してsscanf()を使うのが常套手段だから慣れておくといいよ。
ああ、猫でもわかるC言語の問題がちらほら見える 俺もあれ使ってるけど、最初のうち物凄い懇切丁寧で分かりやすいのに ポインタあたりから突然ソース丸投げ、説明端折りまくりでわけ分からなくなるよなw 一番大事な部分なのにあの説明の少なさは酷い ポインタで躓く人が多いって書いてるのにこの本が一番分かりづらい
>>429 実は作者もポインタをよく理解していないという事情が…あるのかもね!
猫はWinAPI関連のはいいんだけどC自体はちょっと
こんちは C言語、「一般的なレベルの専門学生」っていうと、 どの辺までできるもんだと想像しますか?
haro- wa-rud
双方向リストの追加削除、ファイルを使った保存読み込み 人対人のオセロゲーム(コンソールで十分。ネットワーク越しの対戦が可能ならさらによい) ぐらいはできるようになってるんじゃないの、とおもう。
436 :
デフォルトの名無しさん :2009/01/30(金) 19:06:37
>>432 scanfにポインタでない実引数を渡す
>>435 そんなの学校いかなくても自習だけでできるよ
>>435 >>436 ありがとうございます
私はよくわからないんですが、
「プロンプトでの引数の渡し方、ファイルへの書き出し、
バイナリファイルの入出力、構造体、マクロ、共用体と列挙体、
、複数ファイルのプログラム、メモリ管理、」
はどの辺になりますか?
専門生としては初歩でも知ってる感じでしょうか?
>>438 学校なんてピンキリだろ。
何にも出来ないまま卒業するやつだっているし。
質問がバカだって言ってんだよ。
440 :
デフォルトの名無しさん :2009/01/30(金) 21:04:42
双方向線形リストのプログラムを書いていますが
リスト構造体の宣言の部分周辺で以下のようなエラーが出てコンパイルできません。
使用中のコンパイラはMSVC++2008Exです。
list.h(19) : error C2061: 構文エラー : 識別子 'LIST'
list.h(20) : error C2143: 構文エラー : '{' が '*' の前にありません。
list.h(21) : error C2059: 構文エラー : '}'
ソースは以下にあります。
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/8790.zip どうしてエラーになるのでしょうか。
またどうすればエラーを解決できますか。
>>439 そんなことも全部ひっくるめたイメージってことの前提で
聞いているつもりでつ
>>438 で言うようなことは、いい学校なら最初の半年のうちには習うし、
出来のいい学生なら、入学前から出来る。
ダメな学校なら一年掛けて教えるし、
ダメな学生なら、卒業してもそれが出来ない。
>>441 カリキュラムには含まれているだろうが
半分以上の卒業生は分かっていない
そんな感じ
高校卒業してるからといっても
英作文できるやつのほうが少数でしょ
中学・高校で6年もやってるのにね
>>442 >>443 ありがとうございます
あれは臭いを嗅げる程度の入門書の目次からの抜粋なのですが、
はじめがきに
「これだけ知っていれば、C言語でプログラムが書けます、
と言えるだけの必要最低限の基礎知識に絞って解説してあります」
って書いてありました。
そんなくだらないこと気にする前に一行でも多く書け
>>444 専門学校に限らずダメ学校の生徒は技術者にならない場合が多いし、
何処の学校でもダメな学生は技術者にならないだろ。
考えていることがムダ。
>>440 中身読んでないけど、構造体の定義のあるヘッダをインクルードし忘れてるんだろう
>>447 typedef struct LIST {
int data;
LIST* prev;
LIST* next;
} list;
確かに挿入し忘れてるな。structというヘッダーキーワードが
typedef struct LIST { int data; struct LIST* prev; struct LIST* next; } list;
typedef struct LIST list; struct LIST{ int data; list* prev; list* next; };
452 :
まりも :2009/01/30(金) 23:25:49
ポインタについて聞きたいのだけど、配列 char map[10][10];があるとして、 普通に、その配列だけで、できてしまうけど、2次元配列をわざわざ間接参照 *(point+[x*y]+y) で参照させるのが良くわからない。
よく分からない
全然分からないw
とりあえずコンパイル通るコードを書いてくれ
よしよし頭悪すぎw
Windows 32bitOSですが、VC++ 4GBのファイルに fopen関数 ab+ でファイルオープンして fwrite関数で追加書き込みできなくて困ってます。 fwrite関数で4GB以上のファイルって扱えますか? 4GB以上のファイルにライトした場合、 fwriteの戻り値もエラーにならないのですが?
VC++ なら fopen なんぞ使わずに CreateFile 使おうぜ
4GB 以上なんて扱った事は無いけど 引数が明らかに 4GB 以上に対応しているから 大丈夫なんでない?
もし、CreateFileで駄目だったら、ディスクに直接アクセスするしかない。 もちろん、そんなことありえないので、CreateFileは4GB越えも扱える。
>>437 ちょっと聞きたいんだが、学校でないと学べないことって何がある?
>>457 "a+"じゃなくて普通に"r+"で開いて
末尾に_lseeki64を使ってSEEKしてから書き込めば大丈夫かもな。
Win32のファイルには"追記モード"は無くて、ライブラリが独自に末尾にseekして書き込んでるから
その部分で4Gを超えられないんだろう。
あ、seekが不可なだけで、シーケンシャルな読み書きなら 普通のfread等で充分可能だから。 もちろん、stat等でのファイルサイズはビット数が足りないけどね。
小数点第一を.0じゃなく、ちゃんと入力した数字にあった小数点を出したい
>>465 入力はそのまま文字列として保存しておけばよろしかろ。
467 :
デフォルトの名無しさん :2009/01/31(土) 10:27:19
>>465 int suuji;
scanf("%f", &suuji);
printf("%f\n", suuji);
こんなことしてるとか?
>>467 二重に間違ったコードを書くなよ。まともに動きさえしないじゃないか。
469 :
デフォルトの名無しさん :2009/01/31(土) 10:30:01
いや、だから間違ったコード書いてるんだろ。
いや、だから>467ではどんな結果になると思っている? 恐らく、想定しているだろう間違いにはならないぞ。
static int love; うわああああああああああああいあああ
const int love = 0;
473 :
デフォルトの名無しさん :2009/01/31(土) 10:38:07
>>470 >>467 は君に「想定しているだろう」と想像させるだけの意味は持っているってことだよね。
>>467 に提示した意義はそれで達成されるんだけど。
それじゃ元質は置き去りだがな。
475 :
デフォルトの名無しさん :2009/01/31(土) 10:39:26
volatile void *love;
上げ厨うぜえ。
477 :
デフォルトの名無しさん :2009/01/31(土) 10:42:58
出た、下げ厨
二人あわせて、asage厨です。
なんだ味噌汁か
if(i%2=1) 長年の疑問なんだけどなんでこれで奇数を判定するのか原理を教えてくれろ
481 :
デフォルトの名無しさん :2009/01/31(土) 13:14:32
2で割ると1余る数が奇数だから。 %は前者を後者で割った余りを求める演算子。
>>480 なんで長年の疑問になるのかが分からないや
483 :
デフォルトの名無しさん :2009/01/31(土) 13:15:05
=じゃなくて==だね。
>>480 んじゃ、2で割り切れたら偶数、そうでなきゃ奇数って判定にしてみては?
奇数は2で割ったらあまりが必ず1になんじゃん?
まぁ、2n+1で表せるからね・・・
まあまあ。 2歳の時に疑問に思って12歳になって質問してるのかもしれないじゃないの。
if(i%2) すいませんこうでした
>>488 式の評価や計算式の結果が0か否かで if文以下が実行されるから。
490 :
デフォルトの名無しさん :2009/01/31(土) 13:29:47
Cでは0が偽、それ以外が真 奇数なら割った余りが1で真、偶数なら0で偽になる つまり、奇数を判定できる
式の評価については、真だったら1、偽だったら0が返ってくる仕組みがある
>>492 なんで?最終的には、何かしら数値が扱われている仕組みがあるが
真だった場合、1以外の値が返ってくる環境があるなら、教えてくれ。
とりあえずここ、C言語に関してだが。
何も帰ってこないことはあるな
式の評価じゃなくて、比較演算子の評価だろ。
>>493 それじゃあ、「真だったら1、偽だったら0が返ってくる」式の例を教えてよ。
>>493 「式の評価」って何の事をいってるの?
比較演算子の結果という意味?
#include <stdio.h> int main(void) { int a,b,eval; printf("Input > "); scanf("%d %d",&a,&b); printf("a:%d / b:%d / a=b?:%d \n",a,b,(a==b)); return 0; } 2つの値、aとbが同じか、式の評価で返ってくる値は真のときは1、偽なら0だが? 嘘とか言う前に、確認してから意見しろよ、青二才。
>>498 Cで式というのががなんのことを指すのか確認したほうがいいよ
>>494 帰って<日本語でおk
>>495 評価の意味が分かってないだろ?
>>496 だからお前は確認したのかよ?例えば変数aとbがあって、a==bが成立するとき
if(a==b)以下の文が実行されるが、単純に if(a) という形にして、aに0か0以外を入れてみたか?
しかし、比較演算子による評価では、真のときは1が返ってきているんだが?
>>497 分かっているのにしらばっくれるその態度、きめぇ。引きこもり低学歴だろ?w
判定できないとおもいます
>式の評価については、真だったら1、偽だったら0が返ってくる仕組みがある ねーよwwwww
とにかく、whileの繰り返しの条件文に於いても、0か否かで0なら繰り返し終了とはなるが、 そこにも比較演算子で == , && などが使える。そして、その評価式自信が返している値は 真なら1、偽なら0なんだが。とにかく、真なら0以外という考え方もあるけど、 他の言語においては、bool型というのも存在し、それはTRUEかFALSEという扱いではあるが 結局のところ、0か否かでもあるが、1か0が扱われているわけだ。その程度のことも知らないで 嘘だの言える奴の気が知れない。どんだけ思い上がっている、視野の狭いガキだよ? あっ、おっさんか?だとしたら、視野の狭い世界観しかもてなくて、この世を去るんだね。 いかに自分の存在がちっぽけだったか、気づくのは死ぬ直前かもな。あぁ、これで俺の人生は終わる。 俺の人生、なんだったんだろ?比較演算子による真偽の結果すら、理解せずにこの世を去るのか・・・ まぁ、この世に様々人がいて、プログラミングすらしない人はいくらでもいますよ? ほら、もっと他の様々な人を見てごらん?生きてるだけで、働かなくてもお金を得る人もいますよ? そう、金のなる財産を持てば、こんな詰らない議論で争うこともないんだよ? 金持ち喧嘩せずって言うでしょ?詰らないことを気にしていると、すぐに禿ますよ? あっ、もう既に禿ちゃったか?
>>503 >>498 の(a==b)の部分に何が表示されている?あんたがどう思うかじゃないんだよ。
計算機が結果を出しているんだが?w
それじゃ、あんたのところじゃ、真だったら0以外の気まぐれな値が返ってくるんだぁ
へぇ〜すげぇ〜、どんな環境?もし良かったら、その変な時代遅れのへちょい
マシンを教えてくれない?俺の通っていた大学でも、そんなものはなかったよ?
あっ、俺大学生だったのは10年も前の話だけどw
あの大学、すごかったからなぁ・・・今じゃあのときの、何千倍もの処理能力を持った
コンピュータを持っているだろうな・・・なんせ、コンピュータを専用に扱う建物があったし。
真であり、かつ、1以外の値が返ってくる式の例 1+3;
「式の評価」なんていう言葉を使うから訳が分からんのだ 勝手な造語をどうしても使いたいのなら言葉の定義をしてくれ 「式の評価」の結果という表現だけではさっぱり分からん 例として次の場合 a ? "not zero" : "zero"; a という式の評価結果はいかなる場合においてもリテラルを指すポインタになる と表現できるんだぜ
では次、 printf("a:%d / b:%d / a!=b?:%d \n",a,b,a!=b); でaとbが異なる値だった場合は真となるのだが、その時 a!=b が返してきた値は何だった? まぁ、兎にも角にも、真なら0以外というのは間違ってはいないけど?偽なら0は確かに言える。 しかし、真なら1を返しているんだよね。それ以外の値を気まぐれで返す? そんな環境があるなら、是非とも教えてくれ。知りたい。死ぬまでに。 まぁ、知ったところで、0でなきゃifやwhile文が実行されるなら、気にしないけどねw だって、変なことを気にしても、寿命を縮めるだけだし。そんな詰らない生き方、したくないし。 まだ俺は半世紀以上、健全に健康的に生きる予定だからw
こいつはrand君か
馬鹿と言うより病気だな
オマエラカナリアホダナ
あとな、なんだかんだ言っても、デジタル機器は追求すると、2進数、 0と1の組み合わせの仕組みで成り立っている点は外せない。 単純にあるか無いか?しかし、それを使って複雑にパターンを いくつか表現する仕組みもあるわけだ。だからなんだと? まぁ、こんなの大学の授業じゃ序の口。俺は実験でそれ以上のことをやったけどな。 そのそれ以上に、論理回路に関わるものもあったが。 2進数の仕組み、先頭の符号で正と負を表すことについてや、 コードを使って回路を作ることも。入力する値でどういう結果が出るか? そういうのを見ると、単純に AND や OR の結果がどう返ってきているか、知ることが出来る。 まぁ、そんなの、お前らじゃ知らないだろう。低レベルだろうから。あばよ、いつまでも 底辺を這い蹲る諸君。所詮、俺は君らとは次元が違う世界に住んでいるのだよ。 扱っているものに、共通するものはあれど、レベル、格が違うんだぜ? 同じ食材を使っても、最終的にどんな料理が出来るか、違うかのように、ね?
513 :
デフォルトの名無しさん :2009/01/31(土) 14:03:09
病気だね。
内容はともかくとしてタイピングだけは俺より早い
バカの擁護するのはあまり気が乗らないがJIS X3010の6.5.9には 「各演算子は指定された関係が真の場合は1を、偽の場合は0を返す。」とある とはいえC言語使うなら「真ならば1」とは言っちゃいかんな 入門者が覚えるべきは「非0ならば真」ということでいいんじゃね?
>>490 が言っていることが不十分ってことで。
実際、比較演算子で == や != で返ってきた値は、真なら1、偽なら0だし。
これは実行すればすぐに分かること。ただ、ifやwhile文では、その()の中に
0か否かで実行されるかが決まるという仕組みがあることを言っているに過ぎない。
== や != 、また、 && や || など論理演算子でも試してみれば分かるが、
それらが返してくる結果は、やはり0か1なんだなぁ。真だったら、あるいは
どちらかが成立するか、2つの変数を用いた場合でも、結果は0か1なんだなぁ。
やってみれば、誰もが分かるし、知りうる事実なんだなぁ。
よって、式の評価で真なら1、偽は0というのは、間違ってもいなければ嘘でもない。
そこまで物申すなら、てめぇが使っているPCに文句を言ってやれw
>>515 それは正しいが、
彼は、等値演算子の話ではなく、謎の「式の評価」の話をしている。
>実行すればすぐに分かること こういうこと言う派遣は即刻クビにしてる。 実装依存とか、コンパイラ依存とか困るからな。
>>515 そんなことより「式の評価」の意味は?
こっちを擁護してあげたら?
ちなみに、今回は i%2 と、余りが0か1かではあったが、これを i%3 などにして、余りが0かそうでないかでも、if文やwhile文などの 実行に使えるわけだが、この場合、真か偽ではなく、if()の中に与えた値が 0か否かであって、式の評価で真偽を求めたものではない。 その仕組みを使ったテクニックに過ぎんよ。式の評価はあくまでも真か偽か? また、代入式を用いて、左側の変数に代入された値を使うやり方もあるけど。 まぁ、なんだ、とにかく 俺とお前らでは確実に 格段に レベル が違うんだよ、わははははw 悔しかったら、年商何億の会社でも立ち上げてみろ?
3 + 5 と言う式を評価したら、8が返ってきました
522 :
デフォルトの名無しさん :2009/01/31(土) 14:19:22
a==bの真偽で返ってくる値が0か0以外かで、わざわざ0以外だからって 893とか801とか返してくるわけねーだろJK 真なら1で問題ないよ。どこのヘタレ知ったかプログラマだよ、こいつ?w
>a==bの真偽で返ってくる値が0か0以外かで、わざわざ0以外だからって はずれ
a==b ? 893 : 801;
真なら1が返ってくる、に対して嘘といった貴方、自分の環境で真なら 何が返ってきたか、教えて下さい。え?0721が返ってきた? なんというエロい環境だ、今すぐPCを窓から(ry
で、「式の評価」って何なの?
cond ? 0 : 0721
ぶははははは、間違っていない、PCが実行した結果に対して嘘と言う嘘つきw お前が嘘つきじゃ、ボケぇw 悔しかったら、それを覆すようなへんてこりんなマシンでも作ったらぁ? まぁ、そんな変態マシンが売れるとは思わんが、CPUはintelやAMDが 製造したものが流通しているし、M/BもそれらのCPUが組み込めるものが多いし。 真なら気まぐれで0以外は当然のごとく、さらに1以外の値も返す環境を是非とも 今世紀中に完成させてくれw あっ、うちの企業じゃそんなの採用しないけどw
とニートが申しております。
なんでそんなに火病ったのかが分からん。
532 :
デフォルトの名無しさん :2009/01/31(土) 14:29:46
よっぽど悔しかったんだろうな
ifがする判定→「0」と「0以外」 真偽式がする判定→「0」と「1」 式が持ちうる値→Priceless
でもタイピングだけはほんとに早い
戻り値 式の評価(引数) { if(引数==真) return 1; if(引数==偽) return 0; return 未定義; }
536 :
デフォルトの名無しさん :2009/01/31(土) 14:37:03
真か偽を0かそれ以外のどれか1〜、あるいは-1〜で表現されている環境があるなら 是非とも教えて下さい!ひっじょーーーーーーーーーーーーーーーに下らないけど 死ぬまでに知りたいぜ、そんなヘンテコリンなマシンをw あっ、でも買わないよ。要らないから、そんな変な環境もOSもw
isalpha('a'); どう見ても真です
久々に変なのがわいているな いったい何の話をしているんだ
rand君と聞いてやってきますた
ぶははははは、ぎゃはははははは、ソースコード、実行結果で結論が出ているのに 評価で真なら0以外w 0以外なら真というのは分かるが、敢えて真偽で真なら0以外のどれかw 意味合いが違うってことに、いい加減気づいてね ♥ あと、あれを真偽と解釈するか、疑問の余地在り。
>>538 ひさびさっていうか、こいつはしょっちゅう湧くぞw
こいつ、真偽値として1, 0が生成されることを OSかマシンアーキテクチャによるものと勘違いしている節がある。 どうしようもないな。
どうしようもないことは >ぶははははは、ぎゃはははははは、 この部分ですでに分かる。
真偽で真なら1が嘘wwwww 本当なのに、何が真偽やら? にしても、真偽とある値が0か否かでifやwhile文などを実行する場合は 別に1でなければいけないわけじゃないが、それをいちいち 真 と言うのかね?w
「条件式を評価するとその結果」と言いたかったのだろう。
>>545 >ifやwhile文などを実行する場合は
>別に1でなければいけないわけじゃないが、それをいちいち 真 と言うのかね?w
ifやwhileの条件部は「真偽」を判定しています
1以外の数字でも「真」であると判定されるのです
550 :
デフォルトの名無しさん :2009/01/31(土) 15:01:50
真偽で真なら0以外でも1ではない何かって、どんだけ捻くれた環境だよwwww 偽なら0で真なら0以外としても、普通に1が使われてんじゃん、あの実行結果で分かるようにwww 頭おかしいんじゃね?
思い込みが激しくて他人の言ってる内容が理解できないから議論にもならない。 なぜか、自分の方が頭いいと思ってるらしいから余計手に負えない。
553 :
デフォルトの名無しさん :2009/01/31(土) 15:05:56
先生!a=1 , b=1 の時、 a==b が返す値は何ですか!? 先生の環境でどんな結果が出たか、お答え下さい! くれぐれもっ、先生の、脳内解釈や妄想でのお答えは、お止めください!
「式の評価」という言葉はあるよ。 これは実際に値を計算したり関数を呼び出したりすることによって行われる。 ちなみに、式の末に";"をつけると「式文」という文になり、 制御構文の中身などにも使える。 ただ、これと、「関係演算子の演算結果が真のときに1を返す」はあまり関係ないね。 「関係演算子を評価すると0か1を返す」というだけのことで。
つまり、「式」というのは値を持つわけで、その「値」を計算することを
「式を評価する」と言うんだな。
でも、
>>491 はそのことをわかってないけど。
>>555 彼の脳内では、自分への反論は比較演算子や論理演算子が1以外を返すって主張に
自動的に変換されてるから。
ある意味天才だな。私にはできない解釈だ。
a==bの返す値が偽なら0だけど、真なら1だけでなく、それ以外のものもあるって どんだけえぇ〜wwwww 調べもしないで、他人を嘘呼ばわりする基地外ってやーね 思い込みが激しいんだろうね。そんなんだから、社会に適合しないんだよ、ちみは。 何事にも、式が返す値というのはあるのだよ、ワトソン君。
もしかしたら彼は本当に「式」ってのが何なのかをわかってないのかもしれないね ここまでファビョってる姿を見るとそう思えてくるよ
そんなことは前に代入式でファビョったときからわかりきってるw
薬を飲んで落ち着いたらしい
無理に呼び出す必要も無い
rand_kun();
スレがのびてるから見てみたら固定湧きだったでござるの巻
また何か暴れてるのか 勘弁してくれ
568 :
デフォルトの名無しさん :2009/01/31(土) 20:09:03
char ss[ ] ="123abc"; としたら ss[4]の値はいくらになるんですか?エラーになりますか?
お手数かけます 自分が見ているテキストに #include <stdio.h> int main(void); int main(void) { int c; while ((c = putchar()) != EOF) { putchar(c); } return(0); } というのがあるのですがc(9) : error C2198: 'putchar' : 呼び出しに対する引数が少なすぎます。と エラーになってしまいます。これはどこを変えればいいのでしょうか?
一つ目のputをgetに
>>570 一個目のputcharは、getcharの間違いだな
なんて言うテキスト?
みなさんサンクス!コンパイルできました! ほんとあんがと
マルチスレッド
普通はwhile(a != 2)ってやるよ
>>577 ありがとうございます
やはりマルチスレッドしかないのでしょうか
>>578 試してみましたが、while文がscanfで止まってしまいます。
ただ、私の試し方が間違っているのかもしれません
>>579 > やはりマルチスレッドしかないのでしょうか
Windowsなら、GetAsyncKeyStateとかでもいいんじゃない?
581 :
デフォルトの名無しさん :2009/01/31(土) 23:01:05
入力を待ち《ながら》表示するんだろ? 本質的にマルチスレッドJK
>>579 非同期入力を使えばできるが、入門の範囲外&処理系依存。
>>581 入力があるかどうかチェックして、
なければ表示を続ければいいだけよ。
環境依存だから環境を提示してもらわないと
方法に関しては何とも言えないが。
>>580 GetAsyncKeyStateを使ったことがないので勉強してみます。
いろいろ応用が利きそうなので幅が広がりそうです。
ありがとうございました。
>>581 、582
ありがとうございます。
はやりマルチスレッドを使うべき場面なのですね。
一度試して失敗してるのでもう一度やってみます。
kbhit()
懐かしいなw kbhit MS-DOS 時代によく使ってたわ conio.h 最強
コニオ懐かしいな
while(1){
/* ループ時の処理 */
if(kbhit()) if(getch()=='q') { /* 処理 特にscanfやbreakなど*/ }
}
みたいなのがリアルタイム入力としてネットで紹介されてたんで、当時役立った。
getchはWindowsユーザー用でLinuxで使えないから注意な。
>>480 から始まった式評価だが、、、
概念(や用語のC言語での意味)はあるにはあるが、
結局のところは、絶対規則でなく、C99なりを”参考”にして勝手にコンパイラ作って
周りの人間がそれをC言語コンパイラやコンパイラを通るものをCソースと認めてるだけだろ。
gccとVCとbccで使われてる概念でも、絶対的なC言語とはいえないだろうし。
if(評価式) は if(評価式!=0)にプリコンパイルされると聞いたことある気がするが
例外起こらない用に、どう同値のアセンブリ言語に書き換えられるか?だろ。
で、まとめると?
大抵あるけどね、getch() ライブラリは当然違うけどさ
>>588 生半可な知識乙。
色々言いたいこともあるが、一点だけ。
>if(評価式) は if(評価式!=0)にプリコンパイルされると聞いたことある気がするが
誰に聞いたんだ?
学校の先輩
義理の妹
まあ確かにCならそう書き換えても意味は変わらないけどさ。 単に、条件式では0以外の値が真と解釈されるというだけの話。
プリコンパイルって言葉自体が怪しい響きだなw Cの規格にプリコンパイルなんて処理はない。 コンパイラが独自にプリコンパイルを導入している事はあるが、 これはヘッダファイルを予めある程度コンパイルしておくことであって、 そんな怪しい事をする処理のことではない。 まあ、意味は同じだし、コンパイラが内部的にそう変換して解釈してるかもしれないが、 Cの規格がそういう変換を強要することはない。
rand君がお目覚めになったようだ
javaを使え。Cのような低レベル言語を使うからそういう失敗をするのだ
>>588 日本語でおk
何が言いたいのか分からないが、
別に規格が絶対的な規則だなんて誰も言ってなくて、
世間的にC言語のスタンダードがC89(含C99)だから、
処理系を指定せずに「C言語」って言ったら
ほとんどの人がC89準拠の処理系なのを前提に話すだけさ。
規格があって、ほとんどのCコンパイラが規格にそってるのに、
唐突に「俺用語」で話されたって会話できないよ。
コイツって規格というものの意味を理解してないから絶対に話はかみ合わないよ
Javaを使うのにはかなりの年期をかけたCの経験 が必要。 最初にJavaで入る学習階梯が最近脚光を浴びつつあるが Javaの基礎を正しく学べなければCをかじったほうが まだマシという状態になる。 Javaを正しく学べればCを学ぶ時につきがちな 悪い癖をつきにくくさせる効果はある。 という意味でJavaは決してCの簡易版ではないな。
で、要約すると?
>>601 おそらく誰もCの簡易版だなんて思っていませんよ。
Javaスレにお帰りください
誰も言っていない事を言ったと思い込んで それに反論するのが彼の得意技。
要約 JavaScriptを使え(嘘)
JavaScriptはいい ブラウザが荒らわれる
609 :
デフォルトの名無しさん :2009/02/01(日) 02:07:51
>>606 正論を言えないお前が必死だなw
あいつがどうとか言う前に、自分が正しいことを言えているのか
レスを読み返してみろよ?真なら0以外の1以外でも返ってくる
ヘンテコリンな環境を使用中の時代遅れのオッサン?w
> 真なら0以外の1以外でも返ってくるヘンテコリンな環境 これが(君以外)誰も言っていないこと 比較演算子は0か1しか返さないのは規格で定められている。
比較演算子は0か1しか返さないが
int a = 3;
if(a) { ... }
のaは3と評価される。
みんなこういう話しかしてないが、
>>609 はいつまでたってもそれが理解できていない。
612 :
デフォルトの名無しさん :2009/02/01(日) 02:17:39
>>610 が早速釣れました!
a==bが返す値を見ても、まだ分からない大ボケ。何歳なんだろうね?
まぁ40過ぎた時代遅れのオッサンなんだろうけどw
>>595 プリコンパイルの説明として
> ヘッダファイルを予めある程度コンパイルしておくこと
というのはいかがなものかと。。。
プリコンパイル済みヘッダーのことを指してるんだろうか?
そうだったとしても、ある程度コンパイルという言葉が出る時点で程度が知れる
プリプロセッサ?
615 :
デフォルトの名無しさん :2009/02/01(日) 02:23:20
真か偽で偽なら0、真なら1が返ってくるというのは分かりきっているのに 自分が言いたかったことは、真ならifやwhile文の条件が実行されることに対し 安直に0以外なら 真 と言ってしまった勘違いから、話は食い違っているんだが? そもそも、真偽では真なら1が、偽は0というのは確たる証拠、実行結果が出ているし。 こいつの勘違いは、とにかく0か否かを、無理やり真偽に持ち込んでいるところ。 ある変数などを用いて、0でなければ実行させる仕組みは、別に真偽とは言わない。 何も真か偽か?で判断しているわけじゃないから。その程度の仕組みも理解出来ないくらい 短絡的な思考回路しか持っていないんだよ、時代遅れのオッサンは。キモイ。 もっと視野を広げな。そもそも、このスレで議論している人が、地球にいる何十億といる 人の中の、ほんの数名しかいないということに気づけ。それも、一概には言えないが 恐らくここでレスしている人は、ほとんどが日本人だろう。議論の場が既に小さくてちっぽけ。 だから、自分が言うことが正しい、で押し通そうとしているんだよね、引きこもりの視野の狭い奴はw
真なら1、偽なら0という、Cの規格を逆から読む討論は活発に進んでいますか?
>>612 お前は何と戦ってるんだ。
a==bが0と1以外を返すと言っているやつは誰一人としていないのだが。
とりあえず、相手が間違っていないのに 嘘 と言った奴は、まず謝罪しとけよ。 あと、嘘なら嘘という証拠を提示しろ。その証拠が提示できない、明らかに 真偽である真偽の判定に於いて、真なら1、偽なら0という結果が出てしまっているというのに。 if、while文を実行させるために与えている値が何なのか?分からないようじゃ プログラマ以前に、物事を理解する頭すら持っていないと思われ。 分かりきったコードを書いて、プログラミングが出来た気になってなさい。 所詮、この世で行われている、ペーパーテストなどで評価される試験なんて、そんなもん。 分かりきった答えを暗記で済ませられるからねぇ。 まぁ、出題者側も、あれこれ問題を変えたり、その模範解答を作るのが面倒だからね。 世の中、所詮そんなもん。しかし、間違っていないことに対し、自分がそう思うか否かで 勝手に反対するだけで、事実を述べられないどころか、述べられないくらいに証拠を提示されて 反論できなくなるのは、痛すぎる。
いや、むしろシャドーボクシングが行われているだけだ。彼の敵は存在しない。
620 :
デフォルトの名無しさん :2009/02/01(日) 02:29:54
>>498 で a==b それ以下にある a!=b が a と b の値によって
等価か不等か、真か偽で返ってくる値は明白だな。
1か0。まぁ、0でなければifやwhile文などは実行されるからねぇ。
わざわざ、0以外ならそれを「真」と思い込む、コードの意味も分からん
ド素人は誰だよ?プログラマ失格だろJK
> 0でなければifやwhile文などは実行され なんだ。ちゃんとわかってんじゃん。
0以外は「真」だよ。
>>620 ==とか!=とか<や>の類は全くもってその通りだけど、Cではこれができてしまうから面倒な話になる。
int is_hoge() {return 3;}
void f()
{
if (is_hoge())
...
}
625 :
デフォルトの名無しさん :2009/02/01(日) 02:47:04
反論するならするで、実際に証拠を提示すれば良いのに、a==bやa!=bの 真偽の判定で返ってくる値が、0か0以外、1とは限らないという考えは意味が分からん。 とにかく、あのコードで実行すれば、結果が出てしまうわけだが。 そもそも、別にif()の括弧の中に入れる値はいくつかあれど、それと 真偽の判定は別だから。あくまでも、それによって返ってきた値で 真だったら、偽だったら、という解釈はあるが、分かりやすいものに !aで、aに入っている値が0か否かで、その逆はどうなるか?ね、その程度の検証もしないで 知ったかぶってんじゃねーよ、時代遅れ。
>>613 オブジェクトファイルになるわけじゃないし・・・
遊んでるだけだから反応するだけ損だよ
>真偽の判定で返ってくる値が、0か0以外、1とは限らないという考え こんな風にさりげなく言葉を置き換えるんだよな。
ごはんといえば白米のことである。 ↑ 嘘(玄米もあるし、食事全体の総称としてごはんは定着している) ↑ 白米をごはんといわないならなんて言うんだよ。嘘とか言うな知ったかぶり。 という流れか
>>625 > a==bやa!=bの真偽の判定で返ってくる値が、0か0以外、1とは限らないという考えは意味が分からん。
誰1人としてそんなこと言っているやつはいないわけだが。
>>625 が最後の1文以外ここまでのみんなの意見を総まとめしてくれたようにしか思えないんだけど。
うん。 それで、誰も白米をごはんと言わないなんて言ってないじゃない、と言うんだけど、 じゃあ嘘とか言うな(以下長文)と来るわけで、敵はいないというのはそういうこと
すみませんが皆様どちらの方と戦っておられるのでしょうか?
if/while/forの真ん中に書いたとき、 真:elseに行かない or ループが継続される値の総称 偽:elseに行く or ループから脱出する値の総称
>>622 横からすまそ。
「非0が真」 ではなくて、「真が非0」 な。
非0は真以外の意味で使われる場合もある。
たとえば、3cmを表してる場合の3とか。
ifやwhileなどのフロー制御ステートメントにおいて、論理式もしくは、整数と同一視できる値を()の中に 入れることが出来る。 整数と同一視できる式の場合0が論理式評価の「偽」に対応し、0以外が論理式評価の「真」に対応する。 対応するとは、コード実行時のフロー制御挙動が同じという意味 論理式評価の「真偽」は人が考える「真偽」と概ね一致する。というか、一致しない論理式を書いた時 人はその論理式がバグってると言う。 でおkですか?
C言語ってのは、文法には真偽値は無い。 ドラフトのif文の説明にも、「最初の文は非0のとき実行される」 としか書かれてない。真とか偽とかは関係ない。 だけど、意味の上の真偽値は有る。 ドラフトのisalphaの説明にも、「〜のときtrueが返る」 と書かれてる。で、trueは非0と。 結局、数値を真偽値と見るかどうかは、プログラマ次第であり、 非0であれば必ず真というわけではない。 常に正しいのは、真は非0ということ。
640 :
デフォルトの名無しさん :2009/02/01(日) 03:48:29
大学生時代の時にもいたけど、こちらが言っていることを勝手に勘違いして それは違うだの、自分はそれに対してそうは思わないね、としか言わない 話にならない奴はいたよ。こちらが提示したのは、実行して得た結果だというのに。 それがどういうことなのか?までは言及していないのに、いつの間にか 自分が思った通りの結果ではないだの、それについては自分は同意しないだの、 あんたは何を言っているんだと?宇宙に行った事の無い人が、地球にいて 知りうることだけで、実際に宇宙に行ってその場でその人が知った事実を 否定できると言うのかね?かつて、コペルニクスやガリレオガリレイなどが 地動説と天動説を言い争ったかのように、無駄な議論だ。宇宙に出れば それらがどういうことなのか?一発で分かる。百聞は一見にしかず、 その程度の諺くらい知っておけよ、青二才。
>>639 > 常に正しいのは、真は非0ということ。
偽は0であることで、非0が真とは言えないよ。
ifやwhile文の実行に、真偽の判定によって返ってきた値を使う方法の他に
ある変数が0か否かで決定するやり方もあるし。問題は、真偽の判定に於いて
その式自身が返す値が何か?答えは既に出ている。偽は0、真は1。
真だった場合、1の他にも値を返すというのなら、教えてもらおう。
あと、代入式を使ったやり方もあるが、あれは左辺の変数に代入された
値を使用しているとみなして良い。真偽の判定ではないからね。
そもそも、ある式が 成立する かどうかで、真偽を判定している場合 偽は0と返すが、非0が真と扱うのはともかく、真なら0以外ならなんでも返すって 環境を教えてくれ。正直、食い違っているんだろうけど、こちらが言っているのは 何も間違ってはいない。あと、そちらがそこまで言うなら、真偽の結果において 真なら0以外、1以外にも返すものがあるかどうか? あの括弧の中に、0以外を入れれば実行されるという話についてではなく、 あくまでも 真偽 の判定によって 返ってくる値 について、俺は言っているんだぞ? あんたが言う、非0なら実行される=真 という考えは、こちらには無い。というか、それは 真偽の判定のことではないから。
また、ある真偽の判定に於いて、偽なら0だが、その否定では やはり1が返ってくるのだよ。しかし、非0に対して否定 ! を使った場合 0になってしまうわけだが、その結果だけでも、やはり0か1なんだよ。 俺が言っているのはそういうことで、これは俺が勝手に決めたことじゃなく 実行結果で得た検証結果なんだが?だから否定は出来ないよ。 ただ、屁理屈野郎は次にこういうだろう。どんな環境を使っているの? まぁ、それを言うと、今度はそんな環境を否定し始めるから言わないよ。 俺が聞きたいのは、真なら非0で、1以外の値も返す環境を知りたいだけだ。
>>641 >> 常に正しいのは、真は非0ということ。
>偽は0であることで、非0が真とは言えないよ。
は?「非0が真」なんて誰も書いてないだろ。真が非0。
こちらが言ってることを勝手に勘違いするな。お前の言葉だろ。
それから、比較演算子の結果が真のとき1なのは
ドラフトに載ってる。講釈たれるまでも無い。
Each of the operators yields 1 if the
speci?ed relation is true and 0 if it is false.
そもそも if( a==b ) は if 文が判定しているんじゃない。 a==b 自身が返す値が0か否かで、該当したら実行するか? 単純に変数 a に0か0以外を入れてみれば、結果が出る。 だからといって、0以外が真とはその場合は言わない。というか、真偽の判定じゃないから言えない。 if(i%2) で奇数か偶数かを判定しているもんだと勘違いした人の、思い違いじゃないのか? 既に、 i%3 で余りが0か否かでも、結果が出ると言われているのだが? 良いからやってみろ。あとはそれに応じて、自分が思うような結果を導けば良いだろ? 誰もあんたが何をするか、逐一指図なんてしないよ。好きなようにやれ。 ただし、それは己の実力や知識、知恵が及ぶ範囲内でのことになるがな。 他人の手を借りて、金を稼ごうって魂胆は、ずるい奴の考え。努力を惜しむ奴は 金儲けでも最後は失敗するだろうよ。詰めが甘い、とな。
int a=-1; printf("%d\n",a+(int)(1==1)); の実行結果が信頼できる処理系に限っても 常に0になると楽観するプログラマは恐らく 現在も将来も居ないだろうから 素直に printf( "%d\n",a+(1==1)?1:0); とコードしようや。 たとえ仕様書で定められたとしても その仕様書を処理系を開発する人々が守るかどうかは 別問題だと思うぞ。
>>642 もし、
>>623 のis_hogeのような関数を探しているのであれば、Windows APIの中にあるとされている。
typedef int BOOL; #define TRUE 1
でBOOL型を返すIsHogeって関数にIsHoge() == TRUEなんて御法度と言われている。
TRUE以外の値を返すことがあり得るからと。
実際のところどうなのかわからないけど。いつもif (IsHoge())かif (IsHoge() != FALSE)って書くし。
ちと訂正 そもそも if( a==b ) は if 文が 真偽を判定 しているんじゃない。 返ってきた値で、0でなければ、実行している。 単純に変数 a に0か0以外を入れて if(a) で試してみれば分かる。 結局、与えられた値が0か否かであって、if自身が真偽を判定しているわけではない。 あくまでも、成立した場合、偽でなければ0以外の値が与えられた時は、実行する。 よって、if( i%2 ) 自身が、奇数かを勝手に判断しているわけではないのだよ。 余りがあったとき、0以外の値が与えられて、割り切れない値が与えられたという事実が if文によって分かるということだ。
ifが真偽を判定してないってw
ちょっと情報が交錯しているな。 Cの規格書の内容をまとめとくと、 ・if文は非0かどうかを判断しているだけ。真偽は関係ない。 ・真は非0。 ・比較演算子は0か1を返す。 どうしてここまで話が縺れるか。それは、 ・if文が真偽に従って分岐すると勘違する ・非0が常に真の意味だと履き違える ・比較演算子が0か1のみを返すということを知らない 人が多いからだろう。
お前らいつまで頭のおかしい人間を相手してるんだ
>>651 いや、少なくとも「比較演算子が0か1のみを返すということを知らない」は全員が理解しているだろう。
まあ、いずれにせよもう皆納得してくれたかな?
double a=234.56789; double b=0.0; int c=0; b=floor(a); c=(int)b; この場合に234になって欲しいのですが、 なぜか値が違っている場合があるのですが何故でしょうか?
>>654 それで間違いないんだけど、
全員納得するなら0時くらいで終わっているはずなんだ。
ずーっと前からいるけど、このageのバカは ・日本語が不自由(というか論理的に破綻している)、タイピングだけは早い ・自分にしか意味のわからない言葉を使う(例:「式の評価」) ・規格というものを理解していない、好きな言葉は「アセンブリ出力」 ・勝ち誇って長文の連レス、しかもなぜかCとぜんぜん関係のない話を持ち出す という特徴があるので適当に放置したほうがいい
>>655 #inlcude <math.h>忘れてるとかってオチはない?
そもそも、宇宙が無重力と教科書などで知っても、実際に出て体験した それが無重力だと実感した人とは、受け止め方が違うし 無重力状態では、何が起こるか?もその場に行ってみないと分からないことが多い。 特に、食事や排便は大変なそうで。もちろん、移動や器具の取り扱いも。 しかし、そんなのは実体験していない人にとっては、言葉などでの想像に過ぎず、 実際に体験した人がどう感じたかまでは、分からない。しかし、適切に考えられる人なら 多少なりと、適切な行動に移せるが、やはり予期せぬことなどいくらでもあるのが この世の中。自分が知りうる範囲内の知識や知恵、経験なんぞ、ちっぽけだぞ。 思い上がるな、小僧。
>>659 そういうセリフは自分が宇宙に出てから言ってくださいw
>>695 ・勝ち誇って長文の連レス、しかもなぜかCとぜんぜん関係のない話を持ち出す
どうみても世の中に出てる人間のとる言動じゃねーよw
規格をちゃんと読んだことがないから単語の意味を知らないんだ 話がかみあうわけがない
規格上「式の評価」が何を意味するのか、規格を引用して教えてくれw
こんな奴が上司だったら会社やめるわ
>>658 すいません、いろいろ考えても言う事がまとまらないので
質問を撤回させてもらいます・・・。 板汚し失礼しました・・・
タイピングが速いというか、何も考えてないんだよ 反論してるんじゃなくて、同じことを盲目的に繰り返すだけだから
>>665 特別な定義は見当たらないから,一般的な意味で捉えればいいと思う。
5.1.2.3 プログラムの実行
3段落目
> 抽象計算機では,すべての式は意味規則で規定する通りに評価する。
>タイピングが速い カナ入力なんじゃねーのこいつ。
何度も言うようだが、if自身が真偽を判定しているんではない 比較演算子などで、成立するかどうか?が真偽の判定。 それに応じて返ってきた値が0か1かで、とりわけ0以外の値が if文に与えられたとき、その文が実行される仕組みがある。 これはwhileでも言えること。間違っていない事実に対して 異論を唱える君は、その事実が理解できないだけなんだろ? だいたい、ここに来ているごく数名の人に対して、自分の意見を 押し付けてどうする?だったら、もっとより多くの人の集まる場所で 意見をしてみろよ?まぁ、そこには多種様々な考えの人がいて、 また詰らない議論が展開されるだろうよw しかし、真実は1つ、見た目は子供、頭脳は大人、その名は(ry
ていうか日本人じゃないだろ。 普通の教育受けてきたらこうはならんて。
An expression is a sequence of operators and operands that specifies computation of a value, or that designates an object or a function, or that generates side effects, or that performs a combination thereof. 式を評価するということは、式を計算すると言うことだな。
しかし彼は「式の評価」とは比較演算子(等価演算子)を使うことだと思っているのであった
ここからすべてが始まった。質問には永遠無視
491 名前:デフォルトの名無しさん[sage] 投稿日:2009/01/31(土) 13:29:56
式の評価については、真だったら1、偽だったら0が返ってくる仕組みがある
492 名前:デフォルトの名無しさん[sage] 投稿日:2009/01/31(土) 13:32:33
>>491 それは嘘だろ。
493 名前:デフォルトの名無しさん[sage] 投稿日:2009/01/31(土) 13:33:41
>>492 なんで?最終的には、何かしら数値が扱われている仕組みがあるが
真だった場合、1以外の値が返ってくる環境があるなら、教えてくれ。
とりあえずここ、C言語に関してだが。
494 名前:デフォルトの名無しさん[sage] 投稿日:2009/01/31(土) 13:34:20
何も帰ってこないことはあるな
495 名前:デフォルトの名無しさん[sage] 投稿日:2009/01/31(土) 13:34:49
式の評価じゃなくて、比較演算子の評価だろ。
496 名前:デフォルトの名無しさん[sage] 投稿日:2009/01/31(土) 13:35:20
>>493 それじゃあ、「真だったら1、偽だったら0が返ってくる」式の例を教えてよ。
497 名前:デフォルトの名無しさん[sage] 投稿日:2009/01/31(土) 13:36:15
>>493 「式の評価」って何の事をいってるの?
比較演算子の結果という意味?
↓以下、俺が言った式は==を使った式のことだそんなのは文脈上明らかでそれを理解できないお前らが愚かだ的火病
おまえら苛めすぎだろ。もっとやれ
人は自分が所属している環境以外の環境しか見えないのかもな
今まで生きていけたのが不思議
誰が何をほざこうが、if文自体は真偽に対して値を決定はしていない。 与えた値について、真偽の結果、あるいは0か否かでその文を実行するかを 決定しているに過ぎない。そこで、式が成立する場合の真のとき、 0以外だからといって1以外の値を返すような環境があるなら、是非とも教えてくれたまえ。 出せないなら出せないって言えよ?こっちは未来永劫、待ってやるぞ?w お前が開発しても良いけどなw
まだ遊んでんのか!
while(1)あるいは0以外の値を入れたのを、永遠に真と解釈する奴はキモイw 真偽はあくまでも、真か偽か?要は成立するか否か?それ以外の値にまで 0か否かで勝手に真偽をしたと言われても、迷惑だな。
ifが勝手に値を元に、真か偽を決めているって、どんだけ抜けてんだよ?wwww whileにしても、あくまでも真か偽で返ってきた値を用いて、繰り返すかを 決定しているというのに、勝手にそれを真って、誰が決めてんだよ? それじゃ、ある変数xを用いて、while(x)とした場合、xが0でなければ真って 何が 真 なんでちゅか?w それは変数が0か否かであって、真か偽か? ではないのだがw
なにを朝っぱらから騒いでんの?
x=3 if(x) 実行されたからxは真だーー!(プ x=0 if(x) 実行されなかったからxは偽だー!(プ ねーよwwwww
何について何を言いたいのかさっぱり分からん
689 :
デフォルトの名無しさん :2009/02/01(日) 10:28:09
すでに入門者のためのスレじゃなくなっているね 新しい質問ない?
>>646 あえて突いてみるが、
規格上「==が0か1を返す」という記述を無視している規格準拠でない処理系なのに
同じ規格に載っている「参考演算子」の挙動は規格に準拠していると信用できるのは、
どういう理由からなんだ?
それとも俺が何かしらのギャグを理解できていないのか・・・
誰か説明頼む。
おまえら熱すぎwww
692 :
デフォルトの名無しさん :2009/02/01(日) 11:11:48
#include<stdio.h> main() { int i, j, t, y, a[10][10]; printf("2次元配列aの行数、列数を入力:"); scanf("%d %d", &t, &y); printf("配列aの要素値を左から右、上から下の順で入力:"); for(i=0;i<t;i++){ for(j=0;j<y;j++){ scanf("%d", &a[i][j]); } } printf("配列aの要素値を表示します\n"); /*この行がエラー*/ for(i=0;i<t;i++){ for(j=0;j<y;j++){ printf(" a[%d][%d]=%2d", i, j, a[i][j]); } printf("\n"); } } c:15:9 unknown escape sequence:'\216' どうすればエラーがなくなるんですか?
>>692 「表示します」を「プリントします」にするといけるかもしれない
695 :
692 :2009/02/01(日) 11:50:13
一晩でスレが伸びてるときってかならず香ばしい奴がいるなwww
ifが勝手に真偽の値を決めているわけねーだろJK if(()の括弧の中に与えられた値が、0か否かで実行している程度だろ 真偽の結果の値は a==b が成立するかどうかで1か0だわ
まだやってんのかwwww
いろいろと不満がある人は #define IF(x) if(!(x)) でコードすれば少しは溜飲は下がるかもな
真偽値なんてものはCにはないし、条件が成立する場合を真と表現することも多々あるが、 かといって、真とは条件が成立する場合であると言い切るのはやや強引。 ここは彼も含めた大方の人が理解していることだと思うんだけど、関係演算子の値こそが真偽値であり それが0もしくは1であることが実行した結果から分かるため、真は1、偽は0と主張しているんだよね。 規格書には関係演算子を評価した値が0もしくは1であることが書かれているようだけど、 それが真偽値であると書かれてるの? 百聞は一見にしかずの件だが、プログラミングにおいては「一見」した時の環境という条件が 常につきまとうから、実行した結果がこうだったから常に正しいという主張は基本的に無意味 であるし、それを盾に自分が正しいという主張をされても誰得。
_Bool
0と非0なんてちょっと勉強すれば出てくるだろ バカじゃねぇの
配列へのポインタで、 char *p = "abc"; という風に初期化できるのに int *a = {1,2,3}; という風にできないのはなぜですか? イメージ的には、どこかにint型の3つ分が確保されて、 その先頭の位置をpに入れてくれそうなんですけど・・・ {1,2,3}というのは初期化する時の表現であって、 配列を表すものじゃないってことでしょうか?
文字列だけ特殊な扱いをしているから、としか言いようが無い
>>701 >規格書には関係演算子を評価した値が0もしくは1であることが書かれているようだけど
>>646
>>704 特殊な扱いと言うか、"abc"は文字列リテラルへのポインタを表すから。
厳密には違うけど近い表現でいうと、
char s[] = {'a','b','c'};
char *p = s;
というようなイメージ。
>int *a = {1,2,3};
これは、ポインタを配列のように初期化しようとしているからエラーになる。
char *p = {'a','b','c'}; がエラーになるのと同じ。
比較演算子の結果が0か1以外になる処理系なんて信頼性が低すぎて使わない方がいい。 バグだから。 ってレベル。
>>646 printf( "%d¥n",a+((1==1)?1:0));
だろね。言いたいことは。
そのあたりのことを察することが
出来ない人は居ないと思うが.
711 :
704 :2009/02/01(日) 14:01:00
707 > のー・・・なんてこったい! s[]のとこ、NULL終端入ってないよ!! すんませんorz
>>707 ヌル文字を忘れてはいけない。
絶対に。
'¥0'がついてなかったのは厳密には違うけど近い表現をした からだと思っていたが...orz
要するにだな int a; if(a)という書き方はするな if(a!=0)ときちんと書け a=(int)(1==1) みたいなこともするな と言いたいんだな、きっと。
716 :
デフォルトの名無しさん :2009/02/01(日) 14:49:48
double *dptr; と宣言したdptrの大きさが4バイトのとき、 int *iptr; と宣言したポインタiptrの大きさは何バイトになりますか? できれば理由も教えてください。よろしくお願いします。
717 :
デフォルトの名無しさん :2009/02/01(日) 14:50:15
C++大好き
718 :
デフォルトの名無しさん :2009/02/01(日) 14:50:46
C++超好き
わからん。 4バイトかも知れないし、2バイトかも知れないし、32メガバイトかも知れない
>>716 おそらく、4バイト。
なぜなら、doubleとintでアドレッシングの違う場所に配置することはないだろうから。
721 :
デフォルトの名無しさん :2009/02/01(日) 14:53:19
C++ヤバいくらい好き
>>716 分からない。
理由はそんなこと標準規格では一切の規定がなく、
何バイトであっても規格に合致できるから。
ただし、同じ4バイトになる環境が多いとは言っておく。
723 :
デフォルトの名無しさん :2009/02/01(日) 14:58:11
C++が一番好き
C++ってなんであんなカミソリの刃の上を歩くような言語なの?
>>716 よほど特殊な環境(俺アーキテクチャーマシンとか)じゃない限り4バイトだろう。
普通のPCならdoubleのデータも、intのデータも、同じメモリーに置くだろうし
同じメモリーなら、ポインターのサイズは必ず同じになる。
ユーザー定義型ならまた違ってくる可能性もあるが、doubleもintも組み込み型だし。
char だけアドレッシングが違うアーキテクチャなんてのもあるわけで、 100% 同じ! と断言することはできないけど、まあ普通は同じだろうな
>Prime50シリーズはすくなくともPL/Iでは、
>セグメント07777・オフセッ ト0をヌルポインターの内部表現として使っていた。
>後のモデルはセグメント0・オフセット0をCのヌルポインターに使った。
>このために TCNP(Test C NULL Pointer)のような新しい命令が、
>それまでに誤った思い込みをして書かれた、
>ヘマなCプログラムを救済するために必要となった。
>もっと古い(バイトアドレスではなく)ワードアドレス方式のPrimeのマシンは、
>ワードポインター(int *)よりもバイトポインタ(char *)のほうが大きいことで悪名高かった。
など。
C FAQ 5.17 に書いてある。
化石マシンだろうけどね。
ttp://www.kouno.jp/home/c_faq/c5.html
>>716 sizeof( double )バイト
733 :
デフォルトの名無しさん :2009/02/01(日) 15:52:08
c言語を勉強し始めたばかりの初心者です。 OSはvista、コンパイラはLSI Cです。 ソースファイルを作成して、それをコンパイルすると文字化けしてしまいます。 実行可能ファイル(.exe)も作成できて、問題なく実行できます。 文字化けしないようにするにはどうしたらいいでしょうか?
特に理由がなければ、LSI Cではなく、VC++Expressの使用をお勧めします。
.exeファイルはテキストファイルじゃないので読めません
>>733 文字の出力先が期待している文字コードでプログラムの文字列を記述する。
>>735-736 NT系で16bitプログラムを実行すると出力が正常になされなくなる場合があります。
したがって、アドバイスとしては不適切ですね。
LSICではなく32bitコンパイラを使う以外の対処を私は知りませんが。
>>737 だから、その「出力が正常になされなくなる場合」ってのは、「文字の出力先が期待している文字コード」を出力していない場合のことだろ。
>>736 の通りにすれば、その場合に当たらない。
したがって、
>>736 は適切。
>>737 VistaにはDOSアプリ実行インフラが無いんじゃなかったっけ?
XPでもconfig.sysをいじらないと漢字フォントドライバ(DOS用)の
ものがメモリにロードされないから日本語を使うDOSアプリの出力が
化けた(usモードで実行されるから)記憶が...
741 :
733 :2009/02/01(日) 16:13:08
>>734 特に理由が無いので、そちらを使用してみます。
>>736 ちょっと自分の説明が下手でしたね。
コンパイル前に表示されていた日本語(例えばDIR<Enter>で「10個のファイル」とか「2個のディレクトリ」など)が
コンパイルすると「??????」になってしまいます。
これを直したいんですがどうしたらいいでしょうか?
>>739 へー、vistaって、SJISを出力するプログラムを実行すると文字化けするんだ。
知らなかったよ。
すごーーーーく勉強になったよ。
>>741 そう。2000やXPもそうだけど、16bitプログラムを実行すると
うまく動いているときもあるけど、コンソールの出力自体が全部おかしくなる。
治し方もわからない。
とにかく32bitコンパイラにするべきなのは確実。
あ、これは、LSICの生成物もそうだけど、 コンパイラ自体が16bitプログラムなのが原因。
>>740 config.sys弄っても多分ダメ
jfontXX系のDOSドライバがXP以降ではレガシーデバイスとして
サポートされておらず従ってCDROMにも添付されていないから。
要するに16ビットアプリは動作するとしても、英語モード
で動作するアプリのみになったって感じ。
747 :
733 :2009/02/01(日) 16:22:58
>>744 わかりました。32bitコンパイラにしてみます。
734が教えてくれたVC++Expressというのは32bitなのでしょうか?
32だよ
64かもね
Windows の16ビット環境が32ビット、64ビット環境と 比べてかなり異質で特殊なものだということさえわかればおk
つーかスレ違いですな
ですな
754 :
デフォルトの名無しさん :2009/02/01(日) 17:51:00
文字'0'のコードが0×30のとき、ぶん「a = '0' + 10;」の実行後、 aの値を■進数で表すと0×3aとなり、10進数で表すと▲となる。 ■と▲には何を入れればいいですか?
0×じゃなく0xな
宿題は自分でやれよ・・・
>>750 たしか、一人がこけたら枕を並べて討ち死にマルチタスクだったかと。
なにをするにしても32bit にくらべてワンステップ余計に必要だったことも記憶しています。
あとWDMにくらべてVxD ってなんだったの?ハードよりから完全撤退してしまったので、そのあたりがわかっておりません。
だからスレ違いだっつってんだろボユゲ
>>759 単なる進化の過程。WDMだって過去の遺物になろうとしている。
VCってintやfloat使ったconsoleアプリを普通に作れるんだっけ? 昔使おうとしてDWORD等のキモい型に馴染めず、それ以来gccかborlandだなぁ
普通に作れるわい
DWORDを使うか否かは、別に窓アプリかどうかと関係ないし、 gccでもBorandでも当然使えるし。
質問があります。 for(i=0;i<=10;i++) { for(j=0;j<=10;j++) { if(i+j=5) { 何か処理 } } } このようなループ処理に間違いはありますか? コンパイルしてもエラーはでませんが、実行すると一瞬で 何も結果が得られずプログラムが終了してしまいます。 プログラム全体はもっと長いのですが、ここが一番怪しいので・・・。
結果はどうやって得ているのですか?
i+j=5
実行すると一瞬で終了して何も結果が得られないって 具体的にどういうこと?それが判らないとどうにも。
「何かの処理」がよほど重くなければ、マトモに動いていても一瞬で終わる罠。
forループでiとjの値が決まりますよね? そのiとjを使って、pow(i,2)+pow(j,2)などの値を求めます。 その結果を最後にprintfで出力する感じです。 なのに実行しても何も出力されません。というか、このプログラムの forループに関係のない、どこか適当なところに「printf("1\n");」と入れても、それすら出力されません。 少なくともこのループが原因じゃないのでしょうか・・。
全部晒しちゃえよ。
どうでもいいけど、整数値の二乗にpow()を使うのはナンセンス。
>>771 質問でも何でもなく、「ループは原因じゃない」って言ってもらいたいだけだろ。
君だってわかっていることだ。
>>771 環境が分かれば解決すると思う
そしてそれはスレ違い
main()の1行目に printf("start main()\n"); return 0; って書いてコンパイルして実行してみたら?
>>774 そうです。
ここが違うってわかればすこしは楽になるのにーーー><;
ひーん。もうちょっと自分で頑張りますorz
>>771 あれこれやる前に、これ動かしてみてよ。
# include <stdio.h>
int main(void) {
printf("Hello, world\n");
return 0;
}
if(i+j=5)
みなさんレスありがとうございます。
>>778 それは動きます。環境が悪いわけじゃないんですが・・。
ちなみに環境はborland C++でコンパイルしています。
>>779 if(i+j=5)が悪いんでしょうか?
そういう怪しいところがあるときは別プロジェクトを作って
怪しい箇所だけのプログラムを作ってみるといいかも(ここでは
>>766 の部分)
表示されればここ以外に問題がある。
ずっとコーディングのことをコーティングだと思ってた
if( i + j == 5 )
>>780 自分で怪しいところを抜き出して単独で試せるようになったのなら、それは大進歩。がんがれ。
怪しいところに見当がついてるなら、そこらをデバッガでステップ実行して、 意図通りにうごいてるか確認すればいい。
簡単にエスパーしておくと原因はおそらく他にある 未初期化ポインタの使用もしくはバッファオーバーフローが濃厚
766です。 エラーの原因がなんとなくわかりました。 a[1000][1000]という巨大な2次元配列を定義したのでstack over flowだということがわかりました。 このような配列を定義しないために、プログラムの根本から見直す必要があるのでしょうか・・・。
int *a = (int*)malloc(1000*1000*sizeof(int)); val1 = a[i*1000+j]; a[i*1000+j] = val2;
free(a);
そのwはCへの侮辱か?
int (*a)[1000] = malloc(1000 * 1000 * sizeof (int));
キャストしないの?
必要ないじゃん?
だってCなんだもん。
#define P(i,j) p[(i*1000)+j] int *p; p = (int) malloc( 1000*1000*sizeof(int) ); 一つの2次元配列風表現手段
P(i+1, j)
サイズが動的に決まる場合はそうせざるを得ないが 静的に決まる場合は配列へのポインタを使う方が楽
使い分けるんだ
static int a[1000][1000]; でいいだろ
まあ、スタックではないな。
大丈夫じゃない場合もあるですか?
仮想メモリOFFで積んでるメモリが2MBの環境で実装する事だってある(あった)じゃない?
1000*1000*sizeof(int)って高々4Mバイトにも満たない量で 現在のPC環境でその程度のメモリをスタックに確保して落ちることは 余り無いと思うのだが.... ちなみに初期状態はすごく小さい量だが、積むと自動的にOSが 拡張してくれる。
>>805 静的領域。プログラムのロード時にローダーが確保してくれるよ、VCの場合。
>>807 再帰呼出とかマルチスレッドとかで問題が出るかも
>>809 Windows だとすぐ落ちるぞ
Linux でも ulimit の範囲内まで
#include<stdio.h>
int hoge(int n){
int dummy[1000]={0};
fprintf(stderr, "n=%d [avoid optimize %d]\n", n, dummy[999]);
return hoge(n+1);
}
int main(void){
return hoge(0);
}
>>812 再起呼び出し関数でも汎用関数でも、関数に対して1回分しか割り当てられないよな?
>>814 そうですね。同じ領域を使いまわすことになりますね
OS-Xでmain関数でだけど、ローカルにint a[1000][1000]確保して 値設定し、printf出力したけど何とも無かったぞ。無事に実行された。 ちなみにメモリ512M /PPC400MHzという10年前のスペックのPCだが.
何も使わなければ問題ないという可能性もあり得るな。
逆に宣言文じゃなくて、メモリの動的確保の最大値とかはプログラム依存でいくらでもでてくる可能性あるけど ・例えば画像データで IMAGE[2200][1900][3];の確保をmallocは1回で確保可能なのか?それとも数回なのか? ・この手の変数を宣言していい回数は、動かす環境のメモリの空きだけに依存か? ・あと、c++のnewみたいに、malloc以外なんかいい物ある?
>>818 自作関数でおk
確保自体は一回でもできるけど、分けたほうが分かりやすい
>>821 こんな感じ
int **alloc2d(int x, int y){ // 二回確保
int *data, **index, i;
index=malloc(sizeof(index[0])*y);
data=malloc(sizeof(data[0])*y*x);
for(i=0;i<y;i++) index[i]=&data[x*i];
return index;
}
void free2d(int **p){
if(!p) return;
free(p[0]);
free(p);
}
int **alloc2d_(int x, int y){ // 一回確保
int *data, **index, i;
index=malloc(sizeof(index[0])*y+sizeof(data[0])*y*x);
data=(int*)(&index[y]);
for(i=0;i<y;i++) index[i]=&data[x*i];
return index;
}
void free2d_(int **p){
free(p);
}
広域で使う変数をmainのに置いて、ほかの関数からはアクセス用の関数を通じてアクセスする、っていう風にやる場合の一般的な書き方見たいなものはあるんでしょうか?
>>823 main()の外に置いたらグローバル変数。一般的も何も、普通にアクセスできる。
なんか皆さんレベル高くてここでお聞きしていいか分からないのですが 下記のコードを実行すると(たとえば S を入力)、 小文字は:sです。英語の大文字を入力してください: 小文字は:*です。英語の大文字を入力してください: と出てしまいます。下の一行が余計なのですが、なぜこうなるのでしょうか。 よろしくご教示ください。お願いします。 #include <stdio.h> int main() { char c; int diff = 'a'-'A'; for(;;) { printf("英語の大文字を入力してください:\n"); scanf("%c",&c); if (c == 'q') { break; } printf("小文字は:%cです。",c+diff); } return 0; }
>>825 scanf()で%cを使うと、Sに続いて入力した改行文字を拾わないで放置してしまうのです。
その文字が、次のscanf()で拾ってしまうので、1行余計になってしまうのです。
取り敢えずscanf()の後にgetchar()を入れておけば巧くいくことでしょう。
但し、実用的には余りいい解決法ではありませんが。
fgetsしてsscanfするとええでってスネオがいってた
scanf直後cが英大文字で無い場合は無条件でループ継続させる
と終了できなくなるので、if(c=='q'){...}の直後だな
830 :
825 :2009/02/02(月) 16:18:40
>>826 なるほど!リターンキー押した時点で、改行文字まで取り込んでしまっているのだけど
scanfは一文字しかもって行ってくれないので改行文字が
バッファ?に残っているんですね。
ためしに、getchar()でとりだしてバッファから消した文字をprintf
したら一行改行されていました。納得です。
>>827 文字数制限できるfgetsでリターンキーの改行文字もふくめ読み込んでしまった後に
sscanfでそれを料理するという感じなのでしょうか。
今後はこの組み合わせで行きたいと思います。
>>828-829 これは入力チェックにつかえるわけですよね。「英大文字でない場合」という
のは正規表現というので、実現するんでしょうか。
気持ち的には
if(c != [A-Z]) 的な???ものと予想しますが、「char型の変数」と「英大文字ではない
という表現」をどう結びつければ見当もつきません。。。
この辺は全然わからないですが避けては通れないのでがんばりたいと
思います。
皆様ご教示大変に助かりました。僅かですが前進できたような気がします。
ありがとうございました。
831 :
825 :2009/02/02(月) 16:23:09
s/れば見当も/ればいいのか皆目見当も/ ですね、すみません。
>>830 (ASCIIコードで A-Z が連続していることを前提に)
if (c < 'A' || c > 'Z') { /* 英大文字でない */ }
× ASCIIコードで ○ 処理対象の文字コードで
834 :
825 :2009/02/02(月) 16:29:54
>>832 なるほど、そういう風に帰着させればいいのですね。
勉強になりました。
あ… isupper/islower の存在忘れてた
おまけに、 isalphaで大小英字 isalnumで英数字全体 など。調べてみるよろし
>>835 ctype.hをインクルードすればいいと今知りました。
大変便利ですね、使わせていただきます。
>>837 かなり便利なものがそろっていますね。
C言語は相当スパルタンな印象があったので意外(失礼)でした。
C言語の勉強、ちょっとやっては長い間サボり、というのを繰り返してきましたが
今日を機会にがっつりと勉強したいと思います。
>>820 呼び出される度に領域確保されてたら、staticの意味ないだろ。
アドレス持ち出し忘れたら、ただのゴミでしかない。
( 'A' ) イクナイ
質問です。 コンソールアプリケーションを作成する際、 main関数も他の関数とほぼ同様に扱われるそうですが、 プログラム内で、main関数を呼び出して御利益のあるプログラム例ってありますか?
>>841 ユーザプログラム内でmain()を呼び出すのは避けた方がいい。
ごりやくはあってもりえきを損ないかねない。
コマンドラインの解析をmainの再帰で実現しているコードならみたことがあるけど とてもおすすめできない
#include<stdio.h> #include"aaa.h" int aaa(); int abc; int main(void) { aaa(); return 0; } //// aaa.h ///// int aaa() { abc = 1; } こうすると 関数aaaのabc が未定義となるのですが良い 方法はないですか?
extern int abc;
そもそもグローバル変数なんて癌にしかならないから 使わない方がいいよ。 ローカル変数を引数で渡すのが良い。
>>847 aaa.h
-----
extern int abc;
int aaa(void);
-----
aaa.c
-----
int abc;
int aaa(void)
{
abc = 1;
return 0;
}
-----
main.c
-----
#include <stdio.h>
#include "aaa.h"
int main(void)
{
aaa();
return 0;
}
>>847 aaa()の本体は、aaa.hで定義され、#include指令を使ってmain.cに取り込まれる。
しかしこの#includeが行われた時点ではint abc;の宣言がまだ記述されていないためエラーになる。
Cの一般的な規則に従えば、.hファイルに関数の定義を書くべきではない。
.cファイルに書いて、.hファイルには.cファイルのコンパイルに必要なその他の定義を記述し、それを.cファイルが#includeする。
プロジェクトが複数の.cファイルにまたがるとき、ある.cファイルのグローバルな変数や関数を
他の.cファイルで使えるようにするには、元の.cファイルに対応する.hファイルを作って、
そこに変数や関数のextern宣言(関数は不要だが)を入れ、それを両方の.cファイルで#includeする。
一つの.hファイルを二つ(以上)の.cファイルで#includeするのは、.cファイル間での矛盾を起こさないためである。
まとめると、君がやるべきことは以下のようになる。 //// main.h //// extern int abc; //// main.c //// #include <stdio.h> #include "main.h" #include "aaa.h" int abc; int main(void) { aaa(); return 0; } //// aaa.h ///// int aaa(); //// aaa.c ///// #include "main.h" #include "aaa.h" int aaa() { abc = 1; }
854 :
847 :2009/02/02(月) 23:10:43
>>848-851 どうもありがとうございました。
分割するとき関数はどこにかけばいいのでしょうか?
これがベスト //// main.c //// #include <stdio.h> #include "aaa.h" int main(void) { int abc; aaa(&abc); return 0; } //// aaa.h //// #ifndef AAA_H #define AAA_H void aaa(int *abc); #endif //// aaa.c //// #include "aaa.h" void aaa(int *abc) { *abc = 1; }
次はリンカについて。
質問です コマンドラインから一桁の数字を入力し 「あなたの入力した数字は○です」 と返すプログラムは作りたいのですが、難しいでしょうか
C言語プログラム内で入力なら、scanf使ったのがC入門系サイトの3ページくらいまでに載ってる。 コマンドライン引数で与えるならプログラム経験皆無なら少々遠い。 自作関数作れるなら(main 引数)でググればなんか出てくる。
#include <stdio.h> int main() { int num; scanf("%d", &num); printf("あなたの入力した数字は%dです"); return 0; }
printf("あなたの入力した数字は%dです",num);
863 :
デフォルトの名無しさん :2009/02/03(火) 23:05:28
C++超好き
864 :
デフォルトの名無しさん :2009/02/03(火) 23:07:49
C++大好き
C++が一番好き
866 :
デフォルトの名無しさん :2009/02/03(火) 23:09:32
C++最高に好き
867 :
デフォルトの名無しさん :2009/02/03(火) 23:10:03
あんたなんてだいっきらい
悔しかったらあんたもC++みたいになってみなさいよ!
C++スレなら他にたくさんあるだろ よそへいって愛でて来いよ
870 :
デフォルトの名無しさん :2009/02/03(火) 23:13:13
誘導しろカス
871 :
デフォルトの名無しさん :2009/02/03(火) 23:15:32
C++が一番強い
D言語・・・
C++(笑)
においとか紳士的な態度ならCだと思っている
>>871-872 C++ VS D・・・ ですね。期待してます。
初心者の扱うC言語の方が、ずっとOSには強敵だぞ。
877 :
デフォルトの名無しさん :2009/02/04(水) 03:10:46
こんばんは。プログラミング初心者なんですけどポインタのところで詰まりました… 内容は ユーザーに入力させた文字列(半角英数 字)をchar型配列にいれ、1文字ずつずら して表示させるプログラムを作成せよ。 入力された順番と同じになったら表示終了。 要するに、 ABCDEってあったら次に BCDEAって1つずつずらして、最後にABCDEに戻ったら表示してプログラムを終了。 というのを作成したいのですがちっともわかりません。。。ご教授おねがいします。
君が女ならおっぱいうp、男なら今夜のおかずうpで教えてあげるよ。
>>877 宿題なら宿題スレ行った方がいいと思うよ
char const * str = "abcde"; unsigned len = strlen(str); for (unsigned ic = 0; ic < len; ++ic) { sprintf("%.*s%.*s\n", len - ic, & str[ic], ic, str); }
>>882 >881は>877へのレスだろうね。
つーか、誰かやるとは思ったが……
>>883 リテラルを上書きしようとしてるし、フォーマットでもないアドレスをキャストなしで喰わせようとしている。
イカレテルとしか思えないが・・・?
そもそも
>>877 をポインタ使ってやる必要があるとも思えん。
要は、sprintf()じゃなくてprintf()だろ。そのくらいわからね?
>>886 そのツモリで書いたとしたら、図抜けたマヌケだな。
888 :
881 :2009/02/04(水) 11:06:08
>>886 そそ。
>>884 >>887 どの辺りが間抜けなのか詳しく。まさかとは思うが、"%.*s"の意味も判らずレスしてないよね?
# どうも、変に日本語をカタカナで書きたがる人種は要領を得ない文章を書くから困る。
↓以下、ナンバーサインがどうのこうのと逆切れレスがつくと予測。
まぁ、厳密に言えば0からじゃなくて1からスタートしてlenと一致するまで回すべきだなw 肝腎の>877の要求に見合う方針かどうかは別として。 >↓以下、ナンバーサインがどうのこうのと逆切れレスがつくと予測。 甘いな。つーか、召喚すなw
俺は"%.*s"の意味が分からんので教えてください
>>890 マニュアルページなりリファレンス本なりをちゃんと読むべき。
とは言え、レスの性質上一応解説。
簡単に言うと整数型引き数の数値で出力カラム数を制限できる。
応用例は、まさしく>881。
簡単な例と出力はこんな感じ。
printf("%.*s", 5, "abcdefghi")→abcde
制限より短い入力に対しては影響しない。
printf("%.*s", 3, "ab")→ab
尚、バッファオーバラン防止などの為に固定長で制限すればいい場合はフォーマットで指定すればいい。
printf("%.3s", "abcde")→abc
老婆心ながら付け加えておくと、"%*s"と"%.*s"の違いに注意。 蛇足ながら、"%*.*s"とすると短い文字列は空白を追加し長い文字列は制限できるので 固定長フォーマットでの出力に便利。
ボケかましたあとの弁解が必死なのって・・・
>>888 >>877 >ユーザーに入力させた文字列
>最後にABCDEに戻ったら表示して
くらいか。
つまりずらしたふりをして入力文字列をそのまま出力すればいいんですね?
これは循環リストの問題ですね。わかります
授業の課題で出たのですが,LIFO(Last In First Out) がどうしてもわかりません #include<stdio.h> struct node{ int key; struct node *next; }; struct node TOP; void pu;sh (int num) struct node *n; n= (struct node *)malloc(sizeof *n); n->next = TOP.next TOP.next =n; } int pop() { 作成 } main() { TOP.next=NULL; pushとpopが正常な動作をしているか確かめられる プログラムを作成 } popとmainがわかりません.お願いします
10行目は void push (int num) struct node *n; n= (struct node *)malloc(sizeof *n); n->key =num; n->next = TOP.nex でした.すみません
宿題は自力でやれ
a=b-c; d=(a/b)*100; fprintf(fp,"%d %d %f\n",b,a,d); これでa,bは正しく書かれるんだけど、dは0.00000になってしまいます。 実際に計算しても0にはなりません。
901 :
881 :2009/02/04(水) 15:25:05
>>894 宿題スレじゃないんだから丸々書く必要もないでしょ。
最後にってのはforの条件をic <= lenにすればOK。
つーか、ヒントだけ書いたつもりを間抜けってのもなぁ。
他人(ひと)に対してそこまで悪し様に言うのほどのものかね。
# 元質が帰ってこないから役に立ったかどうかは判らんがw
>>897 皆目見当つかないなら、教官を拝み倒してでも復習すればいいじゃん。
多少なりとも見当ついているなら書いてみればいいじゃん。
丸投げしたいなら宿題スレに書けばいいじゃん。
>>900 a, b,が整数型(int)なら、d = (double) a / b * 100で。
>>897 まず、リストの先頭を保持する方法がおかしい。
TOP.keyは使用していないんだから、struct node *top;としてそこからリストを始める。
次にpopだが、基本的にpushの逆。
1) topの持っている先頭ノードの場所を一時変数に記憶
2) topの指す場所を先頭ノードの次のノードの場所に変更
3) 1)、2)の操作で切り離されたノードからキーの値を一時変数に記憶
4) 1)で記憶した元先頭ノードの領域を開放する(重要)
5) 3)で記憶した値を呼び出し元に返して終了
ただし、リストが空のときにどう処理するかという問題がある。
通常は、キーになりえない何か特別な値を返すが、
この場合習作だから、無視してもいいかもしれない(課題ならそのへん書いてありそうだが)。
ともあれtopがNULLかどうかはチェックして処理を切り替えること。
mainは、任意個数の数字を入力させてそれを次々にpushし、
入力終了(たぶんEOF)になったら逆にpopで値を取り出して画面に表示すればOK。
>>888 みんな攻めちゃだめ。よく中2で此処まで覚えたじゃない。
そうそう、そういうマイナーな物覚えて使えるって主張できるんだからすごいすごい。
普通に配列で済むのを『オレのプログラムでは2次元配列使ってるから』って言ってる小5よりずっと偉いね。
凝り固まった自分では
char string[256],*P,*Q;
scanf("%s",string);
for(P=string+1;*(P-1)!='\0';P++){
>--->printf(P);
>--->for(Q=string;Q!=P;Q++) putchar(*Q);
>--->putchar('\n');
}
ポインタで書くならこんなところか。
out[256]とかに入れてprintfするのもポインタっぽいけどね。
>>902 ちゃんとdをdouble型の変数で定義してあります。
うわぁ、変数が大文字一文字だ……
>>905 >a, b,が整数型(int)なら、d = (double) a / b * 100で。
にほんごわかりますか?
わけのわからない煽りあいは他所でやれ
910 :
897 :2009/02/04(水) 16:14:27
>>903 ありがとうございます
期限は明日までなのでなんとか頑張ってみます
わからなかったらまた質問するかもしれません
>>907 あ、わかりました。ありがとうございます。
にほんごがわかるのでにほんごできいたんです。
( 例題1 ) 『あの〜、プリーズギブミーチョコレート、お願い。』 ( 例題2 ) 『あの〜、scanf("%c",&chocolate);、教えてお願い。』 選択肢 : (1) 日本語 、(2) 英語、 (3) コムギコカナンカダ (4) その他( )
>>881 この無様なコードがナンバーサインを騙っているのか、本人なのか分からないが、
無様なのだけは確か。
つまり 「それはヨーグルトですか?」 → 「いいえ、ケフィアです」 は、このスレでは、 「それはC言語ですか?」 → 「いいえ、コムギコカナンカダ」 となるのですね?
いいえ、素麺蝮です。
>>877 ポインタ使ってみた。
char *p, *q, str[256];
scanf("%s", str);
for(p=str; *p++; ) {
for(q=p; *q; q++) putchar(*q);
for(q=str; q<p; q++) putchar(*q);
putchar('\n');
}
char *p, *q, *n, str[256]; scanf("%s", str); for(p = str; p != '\0'; p++); do{
920 :
デフォルトの名無しさん :2009/02/04(水) 22:45:14
簡単なログのビュワーを作ろうと思っています。 unixのコマンド tail -f に該当する機能をC(Visual Studio)で実現したいのですが、 ロジック的にどんな感じになるのか教えていただけないのでしょうか? 短い周期で、前回との差分分を追加出力させればなんとか実現できそうですが、 処理に時間がかかりそう気がします。
921 :
877 :2009/02/04(水) 22:51:07
長時間試行錯誤して作ったんですけど #include<stdio.h> #include<string.h> change(int* cnum, char* c){ int i,j,tmp; for(j=0;j<*cnum-1;i++){ tmp=*(c+i); *(c+i)=*(c+i+1); *(c+i+1)=tmp; }printf("%s\n",c); } } int main(){ printf("文字列を入力"); char c[50]; int cnum; gets (c); cnum =strlen (c); printf("文字数=%d\n",cnum); change (&cnum,&c); return 0; } 指摘ください。。
922 :
877 :2009/02/04(水) 22:51:39
長時間試行錯誤して作ったんですけど #include<stdio.h> #include<string.h> change(int* cnum, char* c){ int i,j,tmp; for(j=0;j<*cnum-1;i++){ tmp=*(c+i); *(c+i)=*(c+i+1); *(c+i+1)=tmp; }printf("%s\n",c); } } int main(){ printf("文字列を入力"); char c[50]; int cnum; gets (c); cnum =strlen (c); printf("文字数=%d\n",cnum); change (&cnum,&c); return 0; } 指摘ください。。
いっそtailのソース見ちまえばいいのでは
>>922 デバッグしといた。本当はgets使わない方がいいけど。
#include<stdio.h>
#include<string.h>
void change(int cnum, char* c) {
int i;
char tmp;
for(i=0;i<cnum-1;i++) {
tmp=*(c+i); /* tmp=c[i]; って書き方でもOK */
*(c+i)=*(c+i+1);
*(c+i+1)=tmp;
}
printf("%s\n",c);
}
int main(){
char c[50];
int cnum, i;
printf("文字列を入力");
gets(c);
cnum = strlen(c);
printf("文字数=%d\n", cnum);
printf("%s\n",c);
for (i = 0; i < cnum; i ++) {
change(cnum, c);
}
return 0;
}
void change(int cnum, char *c) { int i; char temp = *c; for(i=1; i<cnum; i++) c[i-1] = c[i]; c[i-1] = temp; } でいいじゃん。
>>922 こんなんでどう?
void change1(char c[]) {
int i, j, n;
n = strlen(c);
for (i = 0; i <= n; i++) {
for (j = 0; j < n; j++) {
printf("%c", c[(i+j)%n]);
}
printf("\n");
}
}
短く書きゃいいってもんでもないな
Windowsで使えるデバッグツールはありませんか? 探してみたのですが、Linux用しかみつかりません。 コンパイラはBCCを使っています
VC++
>>920 #include<stdio.h>
#include<windows.h>
#define N (10)
int main(int argc, char *argv[]){
FILE *fp;
const char *filename="hoge.txt";
char buf[1024];
int i, pos[N+1]={0};
if(argc==2) filename=argv[1];
fp=fopen(filename, "r");
if(fp==NULL) return 1;
for(i=0;;i++){
if(!fgets(buf, sizeof(buf), fp)) break;
pos[i%(N+1)]=ftell(fp);
}
fseek(fp, pos[i%(N+1)], SEEK_SET);
for(;;){
if(fgets(buf, sizeof(buf), fp)) printf("%s", buf);
else Sleep(500);
}
fclose(fp);
return 0;
}
>>920 標準入力に向けて口開けて待つ
餌が来たら標準出力にはき出す
932 :
931 :2009/02/05(木) 00:09:04
ああごめんきにしないで。。。
>>920 #include <stdio.h>
int main(int argc, char *argv[])
{
char *filepath;
FILE *stream;
if (argc == 2 ) {
filepath = argv[1];
} else {
printf("trace <filepath>\n");
return -1;
}
stream = freopen(filepath, "r", stdin);
while(1) {
int c = getchar();
if (c != EOF) putchar(c);
}
fclose(stream);
return 0;
}
934 :
894 :2009/02/05(木) 09:44:58
>>901 や、俺
>>887 じゃないから知らんけど。
おれ自身、速度が問題にならないときは
sprintf で文字列操作なんてしょっちゅうやるし。
>>904 その糞汚いコードは教育上宜しくない。
>printf(P);
論外。入力文字列が "X%X" だったらどうなるか試してみるといい。
>>915 その必死さが寧ろ無様。
>>934 > sprintf で文字列操作なんてしょっちゅうやるし。
そんな話じゃないだろ
>>935 っていうか、コイツ最近になってC系のスレッドに出入りしている、
コンパイルもかけないでコード貼り付けてくヤツだろ。
単なる釣りじゃなくて、本物のマヌケだったんだよ。
よそでやれ
作ったプログラムを起動すると結果が表示された瞬間に ウインドウがとじてしまうのですがどうすればウインドウを 消せなくできるのでしょうか?
return の前にgetchar();でも入れる
getchar()をいれずに何とかする方法はありませんか?
コマンドプロンプトから起動する?
ビジュアルスタジオからやる方法でおねがいします
Ctrl+F5で実行
944 :
938 :2009/02/05(木) 14:00:39
BCC Developerで作成しているのですが メイク → 実行 ではちゃんと結果が出てウインドウ は閉じません。 しかし、このプログラムのフォルダ(Debugフォルダ)にある exeファイルを起動すると結果が出た瞬間に閉じてしまいます。
ステップ実行で起動する。 (=main 先頭で止まる)
ああ、VSじゃないのか。 コマンドプロンプトから実行する。
947 :
938 :2009/02/05(木) 14:20:43
コマンドプロンプトからできました。 クリック起動だけでは駄目なんですね・・・
*.batファイル作って、 *.exe pause で、実行は*.batからってのが一番簡単なんじゃないか。
ショートカット作って cmd /k "c:\〜\program.exe" が一番簡単。
ちょっと教えてください。 私はWindowsXPでCygwinを使ってC言語を勉強しています。 ネットで調べてインストールと環境変数の設定まではうまくいきました。 test.cというプログラムを作って コマンドプロントで gcc test.c と打ちコンパイルして a.exeが生成されました。 そしてa.exeはちゃんと実行できたのです。 問題はここからです。 別のプログラムをコンパイルしても常に生成されるファイルがa.exeになってしまいます。 新しいファイルは生成されず上書きされてしまうのです。 解決策を教えてください。
出力ファイル名をa.exe以外にすればいい
>>950 gcc -o hoge.exe hoge.c
オプションの詳細は「man gcc」を実行。(※英語)
あと、Cygwinには標準で「test」って名前のコマンドがあるので注意。
gcc -o 出力してほしいファイル名 test.c
955 :
デフォルトの名無しさん :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だった場合等) そこで諸先輩のお知恵をお貸し頂きたい!
ceil
957 :
955 :2009/02/06(金) 22:44:46
958 :
デフォルトの名無しさん :2009/02/06(金) 22:45:54
C言語(笑)
アドバイスありがとうございました。 アドバイスどおりやったら出来ました。
960 :
デフォルトの名無しさん :2009/02/06(金) 22:47:59
>>958 笑ってる意味が誰にもわからない
駅前のあぶないオヤジと同じ
961 :
デフォルトの名無しさん :2009/02/06(金) 22:51:02
C言語(泣)
C言語(嬉)
ポインターがわからない奴なんて実際存在しない。 都市伝説。
ポインタどころか、変数の概念が最後まで理解できなかった奴も存在する。
ボイン太を知らない奴なんて実在する
いや居るだろ。 俺とか。
ポインタは分からんが参照は完璧に理解しているぜ
わからんと言うか他人の書いたポインタ操作は読んでる途中で嫌になる。
ポインタなら俺に聞け
ポインタは分かるがダブルポインタが分からない
はいはい
ダブルポインタはないわー
ポインタのポインタをダブルポインタって呼ぶのがそもそもおかしいんだよ 日本銀行は銀行の銀行だけどダブル銀行って呼んだらおかしいだろ?
別に何もダブルになってないもんな
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は当たり前か? でも全体的にどこかパッとしない。
セミコロンだけの文を空文と言う。 空文を使うと、終了条件満たすまでずっとループしたい場合に while(MainLoop()) ; なんてことができたりする。 個人的には while(MainLoop()) { /* 終了条件満たすまでひたすらループ */ } みたいに書くけど。
空文という言葉があったんですか。 for(p=string;p!=0;p++) ; みたいなコード、割と高機能なので使ってます。 でも、 「void型」=「何も返さない」 、 「空白」=「何もない」=「void型と同処理」 だと思ってたんですが、 『空白+セミコロン』は空文だとして、『空白+演算子+値』はどれもエラー、『void+順次演算子+void』は正常。 が腑に落ちない・・・と思ったんですけど、フリーフォーマットを逆算して考えると解決っぽいですね。
;=null statement.
>>978 式と文を混同しているな。
文は式文、宣言文、複合文、制御文、ラベル付き文、空文の6つに分けられる。
・ 式文 式にセミコロンを付けたもの。
・ 宣言文 変数、型などの宣言を行う文。
・ 複合文 複数の文を { } で囲んだもの。
・ 制御文 if 文, for 文, while 文など。
・ ラベル付き文 文にラベルをつけたもの。(このため、ラベルの次には必ず文が必要になる)
・ 空文 セミコロンのみの文。
void 型の関数呼び出しは式文に当たる。
例えば void foo(void); という関数があった場合、
foo() という式があって、それにセミコロンをつけて foo(); という式文になる。
foo() という式の型は void 。void 式とか言うこともある、立派な式だ。
空文は式にセミコロンをつけたものではないので、式文ではない。
式文と空文は文法上厳密に区別される。
式の説明はしないの?
空文は、ブロックの最後にラベルを書きたい場合にも使うことができる。 for(i = 0; i < n; i++) { for(j = 0; j < n; j++) { for(k = 0; k < n; k++) { if(hoge) goto BREAK2; } } BREAK2:; ←これ }
gnu 拡張C を活用したコードみたら796の様な育ち方をしたマは発狂するだろう
式は即値、変数、関数、そしてこれらに演算子を作用させたもの。 変数、関数は、その宣言や定義(関数定義では { } の外)に現れるものを除く。
,の説明がまだだね
986 :
976 :2009/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の引数にあたる部分(括弧内)は、文ですよね?
空文・式文は入れてラベル付き文が入れないのが、しっくり来ないです。
今までただただ仕様、と考えてましたが・・・・(飛ぶなよ、ってのは確かですけど)
セミコロンは単独で空文 式にセミコロンをつけたものが式文 それだけのこと。 文は文だから、上記2つの「セミコロンで終わる文」も含めて、全て「文」。 for文は、「for (式;式;式) 文」という形の文法が規定されていて、 区切りとしてセミコロンが採用されているだけ。
>>942 VisualStudioをカタカナで書いたの初めて見たよ
いわゆるポインタとは、ポインタ変数の事を指しているのですか?
まぁ、BNFの読み方と抽象構文木(AST)の概念を理解すると、より理解が深まるんじゃないかな。
>>989 単にポインタと言った場合には文脈で判断する必要がある。
もちろん、ポインタ値とポインタ変数は区別して呼ぶのがより良いが、
それはポインタに限った話ではない。
ume
産めj
>>985 if (a, b) hoge(); の , はコンマ演算子で、
foo(a, b); の , は関数呼び出し演算子の一部としての扱いになる。
従って
>>984 で既に説明されている。
>>987 C99 では for 文は for(初期化文 式; 式) 文 と定義されてたと思う。
初期化文に書けるのは、式文と宣言文と空文だけだけど。
typo?
>>996 for(;;)について言えば、初期化文が空文で済むが、あとの式が空でもいいのか?
>>998 後の2つの部分は式(ただし省略可)というような定義のはず。
,,―‐. r-、 _,--,、 ,―-、 .| ./''i、│ r-,,,,,,,,,,,,,,,,,,,,,,,,―ー. ゙l, `"゙゙゙゙゙ ̄^ \ / \ ヽ,゙'゙_,/ .゙l、 `i、 \ _,,―ー'''/ .,r'" .,,,、.,,i´ .,/^'i、 `'i、`` `--‐'''''''''''''''"'''''''''''゙ `゛ .丿 .,/ { "" ,/` ヽ、 `'i、 丿 .,/` .ヽ、 丿 \ .\ ,/′ 、ヽ,,、 ゙'ー'" ゙'i、 ‘i、.r-、 __,,,,,,,,--、 / .,/\ `'-,、 ヽ .]゙l `゙゙゙゙"゙゙゙゙ ̄ ̄ `'i、 ,/ .,,/ .ヽ \ ゙ヽ_/ .ヽ_.,,,,--―――――ー-ノ_,/゙,,/′ ゙l ," ` ゙‐''"` ゙'ー'"
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。