スタックについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
R

スタックについて

#1

投稿記事 by R » 16年前

データ構造の勉強中で、スタックを以下のように書いてみました。
#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:スタックについて

#2

投稿記事 by たかぎ » 16年前

> (1)で出力すると123

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

R

Re:スタックについて

#3

投稿記事 by R » 16年前

たかぎさん、ありがとうございます。
てっきり前から順に評価されるものだと思っていましたが処理系依存だったのですね・・・。

たかぎ

Re:スタックについて

#4

投稿記事 by たかぎ » 16年前

> 処理系依存だったのですね・・・。

違います。不定です。

たかぎ

Re:スタックについて

#5

投稿記事 by たかぎ » 16年前

すみません、「不定」ではなく「未規定」でした。

lbfuvab

Re:スタックについて

#6

投稿記事 by lbfuvab » 16年前

不定や未定義や未規定の違いは何なのでしょうか?
教えて下さい。

たかぎ

Re:スタックについて

#7

投稿記事 by たかぎ » 16年前

> 不定や未定義や未規定の違いは何なのでしょうか?

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

閉鎖

“C言語何でも質問掲示板” へ戻る