Masalah Kritis
Compiler C2H selalu mengevaluasi kedua operan logis
(&&
, ||
) dan kondisif (?:
)
Operator. Hal ini berbeda dari Standar Nasional Amerika yang diharapkan
Perilaku Institute (ANSI) C, di mana operan dievaluasi dari kiri ke kanan,
dan operan yang tidak perlu dilewati.
Misalnya, dalam ekspresi (i-- && j--)
,
jika nilainya i
nol, ANSI C tidak mengevaluasi
ekspresi sisi kanan (RHS), dan j
tidak
dinyatakan. Sebaliknya, Compiler C2H mengevaluasi kedua belah pihak,
dekrementasi j
.
Ekspresi berikut adalah contoh lain yang mungkin dipengaruhi oleh masalah ini:
if (i-- || j )
...;
a = ((cond == 1)? i : j );
Gunakan operasi logis dan kondisional yang operatornya memiliki
tanpa efek samping. Operasi dengan efek samping termasuk pra-dan pasca-
peningkatan dan operasi dekreasi (
, --
),
operasi memori (*
, []
, ., ->
),
dan panggilan fungsi.