ページ 11

スタックについて

Posted: 2009年5月30日(土) 16:37
by R
データ構造の勉強中で、スタックを以下のように書いてみました。
#include<stdio.h>
#include<stdlib.h>
#define STACKSIZE 100
typedef struct {
	int top;
	int data[STACKSIZE];
} stack;

//スタックの初期化
void initstack(stack *s){
	s->top = -1;
}
//スタックが空か
int stackempty(stack *s){
	return s->top < 0;
}
//スタックにデータをプッシュ
void push(stack *s,int x){
	s->top++;
	if(s->top >= STACKSIZE){
		puts("overflow");
		exit(1);}
	else
		s->data[s->top]=x;
}
//スタックからデータをポップ
int pop(stack *s){
	if(s->top<0){
		puts("underflow");
		exit(1);}
	else
		return s->data[s->top--];
}
int main(void){
	stack S;
	initstack(&S);
	push(&S,1);
	push(&S,2);
	push(&S,3);
    (1)://printf("%d %d %d",pop(&S),pop(&S),pop(&S)); 出力 1 2 3
    (2)/*printf("%d",pop(&S)); 
	printf("%d",pop(&S));
	printf("%d",pop(&S));*/
}

このプログラムでは1,2,3とSに積んでいるのでしているので3,2,1とポップしてほしいのですが
(1)で出力すると123、(2)で出力すると321と実行結果がなんでか違ってしまいます。
原因がさっぱりわからないのでどなたか教えていただけないでしょうか

Re:スタックについて

Posted: 2009年5月30日(土) 16:53
by たかぎ
> (1)で出力すると123

関数の実引数の評価順序は不定だからです。

Re:スタックについて

Posted: 2009年5月30日(土) 19:48
by R
たかぎさん、ありがとうございます。
てっきり前から順に評価されるものだと思っていましたが処理系依存だったのですね・・・。

Re:スタックについて

Posted: 2009年5月30日(土) 19:50
by たかぎ
> 処理系依存だったのですね・・・。

違います。不定です。

Re:スタックについて

Posted: 2009年5月30日(土) 19:53
by たかぎ
すみません、「不定」ではなく「未規定」でした。

Re:スタックについて

Posted: 2009年5月30日(土) 20:22
by lbfuvab
不定や未定義や未規定の違いは何なのでしょうか?
教えて下さい。

Re:スタックについて

Posted: 2009年5月30日(土) 20:28
by たかぎ
> 不定や未定義や未規定の違いは何なのでしょうか?

JIS X3010:2003の3.4.3, 3.4.4, 3.17.2, 3.17.3を参照してください。