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;
}
È stato utile?

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
scroll top