2010-09-25 17 views
6
#include <iostream> 
using namespace std; 

void f(int x, int y){ 

     cout << "x is " << x << endl; 
     cout << "y is " << y << endl; 
} 



int main(){ 

     int i = 7; 
     f(i--,i--); 
     cout << i << endl<< endl; 
} 

Nos espera que el programa para imprimir "x es 7 \ ny es de 6 \ ni es 5"de correos y de la subasta previa, decremento en C++

pero el programa impreso "x es 6 \ ny es de 7 \ ni es 5 "

Respuesta

11

f(i--,i--); invoca Undefined Behaviour. No escriba tal código.

EDITAR:

Comma , presente en la expresión anterior no es Comma operator. Es solo un separador para separar los argumentos (y que no es un punto de secuencia).

Además, el orden de evaluación de los argumentos de una función no está especificado, pero la expresión invoca un comportamiento indefinido porque está intentando modificar i dos veces entre dos puntos de secuencia.

Uff Estoy cansado. :(

+0

Totalmente de acuerdo Es muy malo usar {en, de} crement operadores dos veces en la misma declaración. – Benoit

+1

@Downvoter: La respuesta es perfectamente correcta. Explique su voto a favor. –

+0

@Svisstack: ',' ​​presente en la llamada a la función no es 'coma operador', es solo un separador y no es un punto de secuencia. –

2

Esto indica que los parámetros se están evaluando de derecha a izquierda, no de izquierda a derecha como se esperaba. Esto puede deberse a la convención de llamadas o de lo contrario, pero generalmente sería una mala idea para confiar en el orden de la evaluación de los parámetros de función

+0

Es la convención de llamadas, los argumentos son empujados de derecha a izquierda en la pila – Aillyn

+0

@Aillyn: INCORRECTO. Pueden ser la forma en que funciona para su compilador, pero en realidad no está definido en el estándar. Quien dice que los parámetros incluso se colocan en la pila para una llamada a función. (Si esto fue C, puede ser más correcto, pero esto es C++ y el ABI no está definido (deliberadamente)). –

Cuestiones relacionadas