es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo entender el “or” o “||” en C++.

Tengo un vector 2d como se muestra a continuación.

Lo que quiero hacer es comprobar si el elemento está en el borde izquierdo o si su elemento izquierdo es 1.

Entonces, lo que intenté hacer es:

Lo que intenté hacer es:

para (int r = 0; r < 5; ++r){
para (int c = 0; c <4; ++c){
if (r – 1 < 0 || mat[r-1][c] == 1)
}
}

Mi pregunta es ¿cómo se ejecuta esta línea?

if (r – 1 < 0 || mat[r-1][c] == 1)

¿Calcula r-1 y mat[r-1][c] == 1 por separado y luego realiza la operación or?
En este caso, ¿puede haber acceso ilegal a la memoria cuando r == 0?

Parece que mi código funciona bien, pero esto no tiene sentido para mí.

¿Podría alguien ayudarme con esto?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Sí, la línea if (r - 1 < 0 || mat[r-1][c] == 1) calcula r-1 y mat[r-1][c] == 1 por separado y luego realiza la operación lógica OR en ellos.

    Cuando r es igual a 0, r-1 será -1 y esto dará lugar a un acceso ilegal a la memoria porque los índices de vector comienzan en 0 hasta el tamaño del vector menos uno. Para evitar esto, se podría agregar una comprobación adicional para el caso cuando r es igual a 0:

    “`c ++
    if ((r-1 < 0 || mat[r-1][c] == 1) y c! = 0) {
        // El elemento está en el borde izquierdo o su vecino izquierdo es 1
    }


    En este código modificado, la condición `(r-1 < 0 || mat[r-1][c] == 1)` solo se verificará si `c` no es igual a 0, lo que evita acceder a una ubicación ilegal de memoria cuando `r` es igual a 0. Además, C ++ 11 proporciona un bucle for basado en rangos que puede simplificar la sintaxis: ```c ++ para (auto & fila: mat) {     para (int c = 0; c <fila.size();++ c) {         si ((c == 0 || fila[c - 1] == 1) && (c! = fila.size () -1 || fila [c + 1] == 1)) {             // el elemento está en el borde izquierdo o su vecino izquierdo es 1         }     } }

    en este código, auto & fila itera sobre cada fila de mat directamente, en lugar de usar índices. la condición verifica si el elemento actual está en el borde izquierdo (c == 0) o si su vecino izquierdo es 1 (fila[c-1] == 1), así como si está en el borde derecho (c! = fila.size () -1) o si su vecino derecho es 1 (fila [c + 1] == 1). c)=”” {=””         si=”” ((c=”=” 0=”” ||=”” fila[c=”” -=”” 1]=”=” 1)=”” &&=”” (c!=”fila.size” ()=”” -1=”” ||=”” fila=”” [c=”” +=”” 1]=”=” 1))=”” {=””             //=”” el=”” elemento=”” está=”” en=”” el=”” borde=”” izquierdo=”” o=”” su=”” vecino=”” izquierdo=”” es=”” 1=””         }=””     }=”” }=”” ="" en="" este="" código,="" `auto="" &="" fila`="" itera="" sobre="" cada="" fila="" de="" `mat`="" directamente,="" en="" lugar="" de="" usar="" índices.="" la="" condición="" verifica="" si="" el="" elemento="" actual="" está="" en="" el="" borde="" izquierdo="" (`c="=" 0`)="" o="" si="" su="" vecino="" izquierdo="" es="" 1="" (`fila[c-1]="=" 1`),="" así="" como="" si="" está="" en="" el="" borde="" derecho="" (`="" c!="fila.size" ()="" -1`)="" o="" si="" su="" vecino="" derecho="" es="" 1="" (`fila="" [c="" +="" 1]="="></fila.size();++ c) {
            si ((c == 0 || fila[c - 1] == 1) && (c! = fila.size () -1 || fila [c + 1] == 1)) {
                // el elemento está en el borde izquierdo o su vecino izquierdo es 1
            }
        }
    }

    en este código, auto & fila itera sobre cada fila de mat directamente, en lugar de usar índices. la condición verifica si el elemento actual está en el borde izquierdo (c == 0) o si su vecino izquierdo es 1 (fila[c-1] == 1), así como si está en el borde derecho (c! = fila.size () -1) o si su vecino derecho es 1 (fila [c + 1] == 1).>

Comments are closed.