見出し画像

Retro-gaming and so on

空目した話

教えて!gooで次の質問を見た。

これの答えは5になるとおもいます。

だけど実行結果は4194432になります。なんでですか?

#include<stdio.h>

void func (int a, int b, int c)
 {
  c=a+b;
 }

int main (void) { 
 int c;
 func(2,3,c);
 printf("%d\n", c);
 return 0;
}

一瞬、

継続渡し方式?

とか空目してしまった(笑)。
関数の引数にcを見るとcontinuation(継続)を即座連想する辺り、やっぱりSchemeに脳を侵されてるなぁ(苦笑)。

なお、上のコードはちょっとだけ手直しすればフツーに動く。

#include <stdio.h>
#include <stdlib.h>

void func(int a, int b, int* c) {  /* 引数 c をポインタにする */
 *c = a + b;         /* c のアドレスに a + b を代入する */
}

int main(void) {
 int c;
 func(2, 3, &c);     /* c のアドレスを手渡す */
 printf("%d\n", c);
 return EXIT_SUCCESS;
}

ポインタの初級問題としてはいいよな。
値渡しと参照渡しの差だ。

なお、Cで継続渡しっぽく書こうと思えばこう書けはする。

#include <stdio.h>
#include <stdlib.h>

void print(int c) {
 printf("%d\n", c);
}

void func(int a, int b, void (*c)(int)) {
 c(a + b);
}

int main(void) {
 func(2, 3, print);
 return EXIT_SUCCESS;
}

Cでは関数はファーストクラスオブジェクトではないので関数ポインタと言う表記がグチャグチャの記法に頼らなアカンが。
それとラムダ式がないから、printf"%d"付きでラッピング出来ないので、別立てで関数を書かなきゃならないけど、一応継続渡し(CPS)方式で記述する事は可能である。
  • Xでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

最近の「プログラミング」カテゴリーもっと見る

最近の記事
バックナンバー
人気記事