2008-11-18 4 views
5

para lo siguiente:¿Cómo se puede ejecutar una operación no operativa en C/C++?

(a != b) ? cout<<"not equal" : cout<<"equal"; 

suponer que no me importa si es igual, ¿cómo puedo usar la declaración anterior sustituyendo cout<<"equal" con un no-op.

+0

posible duplicado de [¿Cómo implemento no-op macro (o plantilla) en C++?] (Http://stackoverflow.com/questions/1306611/how-do -i-implement-no-op-macro-or-template-in-c) – user

Respuesta

20

Si realmente es un operador ternario que no necesita una segunda acción, la mejor opción sería la de sustituir por un if:

if (a!=b) cout << "not equal"; 

olerá mucho menos.

+0

Eso no funciona si se usa como una expresión. "si" no es una expresión en C. –

+1

¿Entonces? La idea es exactamente evitar hacer ese tipo de expresión fea en primer lugar. –

1

Este es un código muy confuso. Usted podría acaba de escribir

cond ? cout << "equal" : cout; 

pero que no lo hará (¿verdad?) Porque tienes convencional if para eso.

0
if (a!=b) cout<<"not equal"; 
11

simple: Me codificarlo como

if (a != b) 
    cout << "not equal"; 

El operador ternario requiere los dos resultados sean del mismo tipo. Por lo que también podría ser capaz de salirse con la

(a != b) ? cout << "not equal" : cout; 

debido a que el operador de la corriente (< <) sólo devuelve la referencia ostream. Sin embargo, eso es feo e innecesario en mi opinión.

1

Creo que el problema aquí es que el operador: tiene dos EXPRESIONES como argumentos. Digamos que ... a = x? y: z;

La expresión, por definición, debe tener un valor ... es por eso que no se puede simplemente "saltar".

4

Lo único que falta en las otras respuestas es esto: No hay manera, directamente, de codificar un "noop" en C/C++.

Además, haciendo: (a != b) ? : printf("equal\n"); realmente compila para mí (gcc -ansi en gcc 4.2.4).

+0

Esto no es del todo cierto. Un bloque vacío puede actuar como "no operativo". Sin embargo, esta no es una * expresión *. Como una expresión debe escribirse en C++, no hay literal/constante que sea universalmente aceptable como "sin valor". "No-op" no es realmente la palabra correcta aquí. –

+1

gcc tiene una extensión que permite omitir el término medio, pero no es legal C o C++. – bames53

0

La sintaxis solo requiere una expresión. Simplemente puede ir: (a! = B)? Cout < < "no igual": 1;

+0

¿cuál es el tipo resultante de esa expresión? Int o Stream? – BCS

+0

no funcionará: estándar: (C? E1: E2) en lo siguiente: si E1 o E2 tienen un tipo no de clase, E1 se puede convertir para que coincida con E2 si E1 se puede convertir implícitamente al tipo de expresión que tendría E2 si E2 se convirtieron en un valor (o el tipo que tiene, si E2 es un valor r).) –

4

El siguiente será lograr lo que busca, sin embargo, puede no estar claro para la gente que lee el código de por qué funciona:

(a != b) && (cout << "equal"); 

Personalmente, estoy de acuerdo con this respuesta de Vinko Vrsalovic .

+0

Eso es un truco interesante, pero por razones de legibilidad yo recomendaría no usarlo. Además, no debe confiar en la optimización del compilador. – ya23

+3

@ ya23, ¿podría ser más preciso sobre qué optimización confía? Esa expresión está bien definida en todos los contextos de optimización. –

1

Si el enfoque del código es la operación de salida y no la condición, entonces algo como esto se podría hacer:

cout << (cond ? "not equal" : ""); 

Sospecho que no es el caso, sin embargo, porque usted quiere hacer nada en la cláusula "else".

0

Ambas declaraciones de compilación:

(a != b) ? cout<<"not equal" : NULL; 

(a != b) ? NULL : cout<<"equal"; 
1

En C++ 11 se puede escribir (en caso de vacío):

somecondition ? foo() : [] {}() ; 

Así que el NOP es en realidad una lambda vacía. Además de vacío, puede devolver cualquier tipo y valor.

Esto puede parecer un poco exagerado por sí mismo, pero supongamos que tiene esto:

somecondition1 ? foo1() : 
somecondition2 ? foo2() : 
somecondition3 ? foo3() : 
       flip_out_because_unhandled_condition() ; 

Ahora bien, si alguien añade somecondition4, pero se olvida de incluirlo en el código de control, el software se llame a la flip_out_ .. .función que causa todo tipo de efectos no deseados. Pero tal vez alguna condición4 no necesita ninguna atención especial, solo necesita ser ignorada. Bueno, entonces usted podría escribir:

somecondition1 ? foo1() : 
somecondition2 ? foo2() : 
somecondition3 ? foo3() : 
somecondition4 ? []{}() : 
       flip_out_because_unhandled_condition() ; 
3

(void)0; es NOOP. Hay muchas buenas razones para usar el formulario expr?false:true. Mira cómo se implementa assert().

Así que en tu ejemplo, utilizar (a != b) ? (void)0 : cout<<"equal";

Cuestiones relacionadas