¿Cuál será la salida del siguiente programa en C?
C++
#include <iostream> using namespace std; int main() { int a = 3, b = -8, c = 2; cout << a % b / c; return 0; }
C
#include <stdio.h> int main() { int a = 3, b = -8, c = 2; printf("%d", a % b / c); return 0; }
C#
using System; public class GFG{ static public void Main () { int a = 3; int b = -8; int c = 2; Console.WriteLine(a % b / c); } } // This code is contributed by sarajadhav12052009
1
% y / tienen la misma precedencia y asociatividad de izquierda a derecha. Entonces, % se realiza primero, lo que da como resultado 3 y / se realiza a continuación, lo que da como resultado 1. El énfasis es que se agrega un signo de un operando izquierdo al resultado en el caso del operador de módulo en C.
C++
#include <iostream> using namespace std; int main() { int a = 3, b = -8; cout << a % b; return 0; }
C
#include <stdio.h> int main() { // a positive and b negative. int a = 3, b = -8; printf("%d", a % b); return 0; }
C#
using System; public class GFG{ static public void Main () { int a = 3; int b = -8; Console.WriteLine(a % b); } } // This code is contributed by sarajadhav12052009
Producción
3
C++
#include <iostream> using namespace std; int main() { // a negative and b positive int a = -3, b = 8; cout << a%b; return 0; }
C
#include <stdio.h> int main() { // a negative and b positive int a = -3, b = 8; printf("%d", a % b); return 0; }
C#
using System; public class GFG{ static public void Main () { int a = -3; int b = 8; Console.WriteLine(a % b); } } // This code is contributed by sarajadhav12052009
Producción
-3
Pero a partir de la definición del resto (como se indica aquí https://en.wikipedia.org/wiki/Remainder ), siempre debe ser un número entero mínimo positivo que debe restarse de a para hacerlo divisible por b (matemáticamente si, a = QB + r entonces 0 ≤ r < |b|).
Entonces, en el ejemplo anterior, -3 no es nuestro resto real porque es negativo.
Por lo tanto, en el lenguaje C/C++ siempre encontramos el resto como (a%b + b)%b (agregar el cociente al resto y nuevamente tomar el resto) para evitar el resto negativo.
C++
#include <iostream> using namespace std; int main() { // a and b both negative int a = -3, b = -8; cout << a % b; return 0; }
C
#include <stdio.h> int main() { // a and b both negative int a = -3, b = -8; printf("%d", a % b); return 0; }
C#
using System; public class GFG{ static public void Main () { int a = -3; int b = -8; Console.WriteLine(a % b); } } // This code is contributed by sarajadhav12052009
Producción
-3
Cualquiera puede predecir la salida de un operador de módulo cuando ambos operandos son positivos. Pero cuando se trata de números negativos, diferentes idiomas dan resultados diferentes.
En lenguaje C, el módulo se calcula como,
a % n = a – ( n * trunc( a/n ) ).
Por ejemplo,
8 % -3 = 8 – ( -3 * trunc(8/-3) )
= 8 – ( -3 * trunc(-2.666..) )
= 8 – ( -3 * -2 ) { redondeado hacia cero}
= 8 – 6
= 2
Nota importante :
Numerador |
Denominador |
|
|
signo x |
signo Y |
signo X/Y |
signo X%Y |
+ |
+ |
+ |
+ |
+ |
– |
– |
+ |
– |
+ |
– |
– |
– |
– |
+ |
– |
De la tabla anterior, concluimos que el operador % siempre considera un signo de un numerador
Para obtener más información, consulte https://en.wikipedia.org/wiki/Modulo_operation
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
Publicación traducida automáticamente
Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA