【C++】Definición razonable de variables en declaración de juicio

Permítanme resumir el núcleo de este blog:

  1. 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)
  2. 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:
inserte la descripción de la imagen aquí

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.
inserte la descripción de la imagen aquí

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.
inserte la descripción de la imagen aquí

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:
inserte la descripción de la imagen aquí

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:
inserte la descripción de la imagen aquí

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.

Supongo que te gusta

Origin blog.csdn.net/qq_16763983/article/details/130199285
Recomendado
Clasificación