Permítanme resumir el núcleo de este blog:
- En C++, no está permitido definir la misma variable repetidamente, de lo contrario se reserva el valor de la definición inicial (aunque la compilación puede pasar)
- Cuando se trata de juzgar varias ramas, las variables deben definirse antes de ingresar a la rama de evaluación. Si se definen por separado en la rama, se producirá un error de compilación (no se puede encontrar la definición de la variable)
Problema 1: la anulación de variable falla
informar error
Primero, definí tres matrices iniciales G, B, A. Espero que cuando m = 4, se puedan imprimir "Matrices de transformación más grandes" y se actualicen los valores (incluidos los tamaños) de las tres matrices.
int m = 4;
mat G = {
{
1.0, 0.0, 0.0},
{
0.5, 0.5, 0.5},
{
0.5, -0.5, 0.5},
{
0.0, 0.0, 1.0} };
mat B = {
{
1, 0, 0, 0},
{
0, 1, -1, 1},
{
-1, 1, 1, 0},
{
0, 0, 0, -1} };
mat A = {
{
1, 0},
{
1, 1},
{
1, -1},
{
0, -1}};
if (m == 4) {
cout << "Larger transform matrices" << endl;
mat G = {
{
1.0/4, 0.0, 0.0},
{
-1.0/6, -1.0/6, -1.0/6},
{
-1.0/6, 1.0/6, -1.0/6},
{
1.0/24, 1.0/12, 1.0/6},
{
1.0/24, -1.0/12, 1.0/6},
{
0.0, 0.0, 1.0}};
mat B = {
{
4.0, 0.0, 0.0, 0.0, 0.0},
{
0.0, -4.0, 4.0, -2.0, 2.0, 4.0},
{
-5.0, -4.0, -4.0, -1.0, -1.0, 0.0},
{
0.0, 1.0, -1.0, 2.0, -2.0, -5.0},
{
1.0, 1.0, 1.0, 1.0, 1.0, 0.0},
{
0.0, 0.0, 0.0, 0.0, 0.0, 1.0} };
mat A = {
{
1, 0.0, 0.0, 0.0},
{
1.0, 1.0, 1.0, 1.0},
{
1.0, -1.0, 1.0, -1.0},
{
1.0, 2.0, 4.0, 8.0},
{
1.0, -2.0, 4.0, -8.0},
{
0.0, 0.0, 0.0, 1.0}};
}
No hay ningún error en la compilación, pero cuando se ejecuta, las "matrices de transformación más grandes" se imprimen con éxito, pero ocurre un error:
Entonces, continúe con la depuración... Se encuentra que el tamaño de la matriz G en un paso sigue siendo la matriz 4x4 definida originalmente, y la matriz 6x3 cuando m=4 no está asignada, lo que provoca un error de desbordamiento.
resolver
El problema es que en la bifurcación if, las tres matrices mat A, B y G se definen repetidamente, y el mat delante de ellas debe eliminarse y asignarse directamente.
int m = 4;
mat G = {
{
1.0, 0.0, 0.0},
{
0.5, 0.5, 0.5},
{
0.5, -0.5, 0.5},
{
0.0, 0.0, 1.0} };
mat B = {
{
1, 0, 0, 0},
{
0, 1, -1, 1},
{
-1, 1, 1, 0},
{
0, 0, 0, -1} };
mat A = {
{
1, 0},
{
1, 1},
{
1, -1},
{
0, -1}};
if (m == 4) {
cout << "Larger transform matrices" << endl;
G = {
{
1.0/4, 0.0, 0.0}, // 删掉了前面的mat,直接赋值
{
-1.0/6, -1.0/6, -1.0/6},
{
-1.0/6, 1.0/6, -1.0/6},
{
1.0/24, 1.0/12, 1.0/6},
{
1.0/24, -1.0/12, 1.0/6},
{
0.0, 0.0, 1.0}};
B = {
{
4.0, 0.0, 0.0, 0.0, 0.0}, // 删掉了前面的mat,直接赋值
{
0.0, -4.0, 4.0, -2.0, 2.0, 4.0},
{
-5.0, -4.0, -4.0, -1.0, -1.0, 0.0},
{
0.0, 1.0, -1.0, 2.0, -2.0, -5.0},
{
1.0, 1.0, 1.0, 1.0, 1.0, 0.0},
{
0.0, 0.0, 0.0, 0.0, 0.0, 1.0} };
A = {
{
1, 0.0, 0.0, 0.0}, // 删掉了前面的mat,直接赋值
{
1.0, 1.0, 1.0, 1.0},
{
1.0, -1.0, 1.0, -1.0},
{
1.0, 2.0, 4.0, 8.0},
{
1.0, -2.0, 4.0, -8.0},
{
0.0, 0.0, 0.0, 1.0}};
}
La operación es exitosa y podemos ver que la matriz G también es el valor que esperábamos.
Volver al ejemplo más simple
#include <iostream>
#include <cstdio>
using namespace std;
int main() {
int m = 2;
int a = 100;
if (m == 2) {
int a = 200; // 这里重复定义了int a,应该直接写成 a = 200 就正确了
}
cout << a << endl;
return 0;
}
Compilar así está bien, pero el resultado es incorrecto:
100
Explique que C++ no permite definir repetidamente la misma variable, de lo contrario se conserva el valor de la variable definida por primera vez.
Pregunta 2: La variable en la rama del juicio no está definida
informar error
Aquí m toma 2 o toma 4, por lo que habrá dos ramas. Entonces, usé el siguiente método de escritura:
int m = 2;
if (m == 2) {
// 分支1
mat G = {
{
1.0, 0.0, 0.0},
{
0.5, 0.5, 0.5},
{
0.5, -0.5, 0.5},
{
0.0, 0.0, 1.0} };
mat B = {
{
1, 0, 0, 0},
{
0, 1, -1, 1},
{
-1, 1, 1, 0},
{
0, 0, 0, -1} };
mat A = {
{
1, 0},
{
1, 1},
{
1, -1},
{
0, -1}};
}
if (m == 4) {
// 分支2
cout << "Larger transform matrices" << endl;
mat G = {
{
1.0/4, 0.0, 0.0},
{
-1.0/6, -1.0/6, -1.0/6},
{
-1.0/6, 1.0/6, -1.0/6},
{
1.0/24, 1.0/12, 1.0/6},
{
1.0/24, -1.0/12, 1.0/6},
{
0.0, 0.0, 1.0}};
mat B = {
{
4.0, 0.0, 0.0, 0.0, 0.0},
{
0.0, -4.0, 4.0, -2.0, 2.0, 4.0},
{
-5.0, -4.0, -4.0, -1.0, -1.0, 0.0},
{
0.0, 1.0, -1.0, 2.0, -2.0, -5.0},
{
1.0, 1.0, 1.0, 1.0, 1.0, 0.0},
{
0.0, 0.0, 0.0, 0.0, 0.0, 1.0} };
mat A = {
{
1, 0.0, 0.0, 0.0},
{
1.0, 1.0, 1.0, 1.0},
{
1.0, -1.0, 1.0, -1.0},
{
1.0, 2.0, 4.0, 8.0},
{
1.0, -2.0, 4.0, -8.0},
{
0.0, 0.0, 0.0, 1.0}};
}
Luego, se produjo el siguiente error variable indefinido durante la compilación:
resolver
Antes de ingresar todas las ramas if, defina el nombre de la variable. En la rama, no hay necesidad de definir variables, solo asigne valores directamente:
int m = 2;
mat G, B, A; // 进所有if分支之前定义好变量
if (m == 2) {
G = {
{
1.0, 0.0, 0.0}, // 删掉了前面的mat,直接赋值
{
0.5, 0.5, 0.5},
{
0.5, -0.5, 0.5},
{
0.0, 0.0, 1.0} };
B = {
{
1, 0, 0, 0}, // 删掉了前面的mat,直接赋值
{
0, 1, -1, 1},
{
-1, 1, 1, 0},
{
0, 0, 0, -1} };
A = {
{
1, 0}, // 删掉了前面的mat,直接赋值
{
1, 1},
{
1, -1},
{
0, -1}};
}
if (m == 4) {
cout << "Larger transform matrices" << endl;
G = {
{
1.0/4, 0.0, 0.0}, // 删掉了前面的mat,直接赋值
{
-1.0/6, -1.0/6, -1.0/6},
{
-1.0/6, 1.0/6, -1.0/6},
{
1.0/24, 1.0/12, 1.0/6},
{
1.0/24, -1.0/12, 1.0/6},
{
0.0, 0.0, 1.0}};
B = {
{
4.0, 0.0, 0.0, 0.0, 0.0}, // 删掉了前面的mat,直接赋值
{
0.0, -4.0, 4.0, -2.0, 2.0, 4.0},
{
-5.0, -4.0, -4.0, -1.0, -1.0, 0.0},
{
0.0, 1.0, -1.0, 2.0, -2.0, -5.0},
{
1.0, 1.0, 1.0, 1.0, 1.0, 0.0},
{
0.0, 0.0, 0.0, 0.0, 0.0, 1.0} };
A = {
{
1, 0.0, 0.0, 0.0}, // 删掉了前面的mat,直接赋值
{
1.0, 1.0, 1.0, 1.0},
{
1.0, -1.0, 1.0, -1.0},
{
1.0, 2.0, 4.0, 8.0},
{
1.0, -2.0, 4.0, -8.0},
{
0.0, 0.0, 0.0, 1.0}};
}
Por lo tanto, se compila con éxito y se ejecuta con éxito.
Volver al ejemplo más simple
#include <iostream>
#include <cstdio>
using namespace std;
int main() {
int m = 2;
if (m == 1) {
int a = 100;
}
if (m == 2) {
int a = 200;
}
cout << a << endl;
return 0;
}
Escribe un error de compilación como este:
Debería cambiarse a (definiendo el nombre de la variable antes de la sentencia):
#include <iostream>
#include <cstdio>
using namespace std;
int main() {
int m = 2;
int a;
if (m == 1) {
a = 100;
}
if (m == 2) {
a = 200;
}
cout << a << endl;
return 0;
}
Entonces, la compilación pasa y el resultado es correcto.
Llegados a este punto, piensa en otra pregunta, si en la rama de juicio definimos repetidamente a en base a este código, es decir, lo escribimos en la forma int a = xxx, ¿se producirá el mencionado error de definición repetida?
#include <iostream>
#include <cstdio>
using namespace std;
int main() {
int m = 2;
int a;
if (m == 1) {
int a = 100;
}
if (m == 2) {
int a = 200;
}
cout << a << endl;
return 0;
}
El resultado del error de salida es:
0
Efectivamente, se vuelve a confirmar la conclusión anterior: C++ no permite definir repetidamente la misma variable, de lo contrario se mantendrá el valor definido por primera vez, es decir, el valor por defecto de a en este ejemplo es 0.