副作用が発生する式の評価順序に依存しないようにすること

解説

1, 2のようなコードの動作は未定義であり、 func1から実行されるのかfunc2から実行されるかは処理系依存。 必ず3のような書き方を行い、func1, func2が実行される順番を明示的に指定すること。

#include <stdio.h> 

int G_a;
int x, y, z;

int main(void){
    /* 1. 非適合例 */
    G_a = 11;
    x = func1() + func2();  //func1から実行されるとは限らない
                            //func1から実行されたのはたまたま
    printf("x: %d\n", x);  
    
    /* 2. 非適合例 */
    G_a = 11;
    y = func2() + func1();  //func2から実行されるとは限らない
                            //func2から実行されたのはたまたま
    printf("y: %d\n", y);   
    
    /* 3. 適合例 */
    G_a = 11;
    z = func1();            //確実にfunc1から実行される
    z += func2();
    printf("z: %d\n", z);
    
    return 0;
}

int func1(void) {
    G_a = G_a / 2;
    return G_a;
}

int func2(void) {
    G_a = G_a * 2;
    return G_a;
}

出力

x: 15
y: 33
z: 15