Ha il seguente codice di invocare un comportamento indefinito?
-
23-09-2019 - |
Domanda
#include <iostream>
#include <cmath>
#define max(x,y) (x)>(y)? (x): (y)
int main() {
int i = 10;
int j = 5;
int k = 0;
k = max(i++,++j);
std::cout << i << "\t" << j << "\t" << k << std::endl;
}
Soluzione
No, non è così.
In questo caso la situazione viene salvato dal fatto all'operatore ?:
ha una n sequenza immediatamente dopo la valutazione del primo operando (condizione) e dopo che soltanto una delle due espressioni (secondo o terzo operando) viene valutato. Il tuo codice è equivalente a
...
bool c = i++ > ++j;
k = c ? i++ : ++j;
...
Nessun comportamento non definito qui.
Altri suggerimenti
Bene, ci sono certamente un sacco di problemi con esso.
- max è in realtà calcolando min
- operatori di incremento sono raddoppiati su qualsiasi scelta è selezionato dal momento che si sta utilizzando una macro
- utilizzando incrementi postfix / prefisso è appena gettato per confondere, ma non hanno un sacco di cuscinetto sul problema.
Questo codice produrrà gli stessi risultati ogni fase di esecuzione, così no, non è definito. Al cout:
i = 11
k = 7
j = 7
Questo suona come un problema di compiti a casa male. :)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow