【C++】判断语句中对变量的合理定义

news2024/11/25 4:58:10

先总结一下这篇博客的核心:

  1. C++中,不允许重复定义同一个变量,否则保留的初次定义的值(虽然编译能通过)
  2. 涉及到判断的多分支时,应在进判断分支之前定义好变量,如果在分支中分别定义会出现编译错误(找不到变量定义)

问题 1:变量覆盖失败

报错

首先我定义了三个初始的矩阵G, B, A,希望当m=4时,能打印"Larger transform 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}};
}

编译没有出错,运行时,"Larger transform matrices"虽成功打印,但是出现报错:
在这里插入图片描述

于是,继续调试…发现是其中一步矩阵G的大小仍然是最初定义的4x4矩阵,而并没有赋值为m=4时的6x3矩阵,因此导致溢出报错。
在这里插入图片描述

解决

问题在于if分支中,重复定义了mat A, B, G三个矩阵,需要删除掉它们前面的mat,直接赋值即可。

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}};
}

运行成功,并且可以看到G矩阵也是我们期望的值。
在这里插入图片描述

回归最简单的例子

#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;
}

这样写编译没问题,但是输出结果错误:

100

说明C++不允许重复定义同一变量,否则是保留初次定义的变量值。

问题 2:判断分支中的变量未定义

报错

这里的m要么取2要么取4,所以会出现两条分支。于是,我用了如下的写法:

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}};
}

然后在编译时出现了如下变量未定义的报错:
在这里插入图片描述

解决

在进所有的if分支之前,定义好变量名。而在分支里,就不需要再定义变量了,直接赋值即可:

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}};
}

于是,成功编译且成功运行。

回归最简单的例子

#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;
}

这样写编译报错:
在这里插入图片描述

应该改成(在判断语句之前定义好变量名):

#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;
}

于是,编译通过且结果正确。

此时,再思考一个问题,如果我们在这个代码基础上,在判断分支内重复定义a,即写成int a = xxx的形式,是不是会出现前面说的重复定义报错?

#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;
}

输出错误结果为:

0

果然,再次印证了前面的结论:C++不允许重复定义同一变量,否则保留初次定义的值,也就是这个例子中a的默认值0。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/424405.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于HashData的湖仓一体解决方案的探索与实践

2023年4月7日&#xff0c;由中国DBA联盟&#xff08;ACDU&#xff09;和墨天轮社区联合主办的第十二届『数据技术嘉年华』(DTC 2023) 在北京新云南皇冠假日酒店盛大开启。HashData资深解决方案架构师李俊在4月8号专题会场6-“融合应用&#xff1a;湖仓技术创新”上发表了《基于…

从零开始学JAVA(05):面向对象编程--04

一、StringBuilder StringBuilder是一个非常方便的用来处理和拼接字符串的类&#xff0c;它和string不同的是&#xff0c;它是可变的 package com.lcy.learn;public class LearnStringBuilder {public static void main(String[] args) {// StringBuilder首先是可变的// 而且对…

牛客网算法八股刷题系列(九)训练过程损失函数不下降问题

牛客网算法八股刷题系列——训练过程损失函数不下降问题题目描述正确答案&#xff1a;D\mathcal DD题目解析延伸&#xff1a;训练过程损失函数不下降的其他情况题目描述 在训练神经网络时&#xff0c;损失函数(Loss)(\text{Loss})(Loss)在最初的几个Epoch\text{Epoch}Epoch时没…

delphi 实现Ribbon风格的窗体

随着office2007的兴起&#xff0c;微软让我们看到了Ribbon风格的窗体&#xff0c;现在很多软件也都开始使用Ribbon风格。 那么我们如果要自己开发&#xff0c;应当怎么做呢&#xff1f;本文就是为大家解开这个疑团的。 首先&#xff0c;Delphi本身并没有Ribbon风格的窗口可以直…

epoll为什么用红黑树?

网络编程的时候有没有碰到过 Socket 对象&#xff1f;或者在配置代理的时候&#xff0c;有没有碰到配置 Socket 地址&#xff1f;当你看到服务端 Socket、客户端 Socket 等名词时&#xff0c;是否可以明确理解这些概念&#xff1f; 学习好这些知识有一条主线&#xff0c;就是抓…

Dockerfile构建镜像缓慢解决方案总结

分几种不同的情况&#xff0c;不断更新中 1、Dockerfile apk add 下载更新软件时&#xff0c;比较慢&#xff0c;如何解决 例子如下&#xff1a; 更好一下仓库源 RUN sed -i s/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g /etc/apk/repositories或者改成科大的镜像 RUN…

android核心架构Framework组件介绍

作为一个android开发者&#xff0c;核心架构是必须要了解的。只有了解每个核心层的作用&#xff0c;才能更深入的理解和学习。本篇主要讲解Java Framework层核心代码流程。 文章目录一&#xff0c;Android系统架构1.System Apps2.Java Framework3.系统运行库层4.硬件抽象层&…

Matplotlib库的简单用法

Matplotlib库的简单用法 Matplotlib是python科学计算中最基础、最重要的绘图库&#xff0c;是Python中最流行的数据可视化库之一&#xff0c;它提供了大量的绘图函数和工具&#xff0c;可以让用户创建各种类型的图表和图形&#xff0c;一般使用matpltlib完全可以满足我们绘图需…

“成功学大师”杨涛鸣被抓

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 4月15日&#xff0c;号称帮助一百多位草根开上劳斯莱斯&#xff0c;“成功学大师”杨涛鸣机其团队30多人已被刑事拘留&#xff0c;培训课程涉嫌精神传销&#xff0c;警方以诈骗案进行立案调查。 …

基于4412的dm9000驱动移植

1 概述 以太网高速稳定的特性比Wifi无线传输有一定的优势&#xff0c;当无线传输无法满足一些智能设备&#xff0c;需要开发设计以太网模块。Linux支持以太网系统&#xff0c;结合4412开发板&#xff0c;重点学习dm9000驱动的设计与实现。 2 硬件资源分析 2.1 4412开发板以太网…

【Python】Python中的列表,元组,字典

文章目录列表创建列表获取元素修改元素添加元素查找元素删除元素列表拼接遍历列表切片操作元组创建元组元组中的操作字典创建字典添加/修改元素删除元素查找字典的遍历合法的key类型列表 列表是一种批量保存数据的方式&#xff0c;列表使用[]表示 创建列表 创建两个空列表 …

nginx优化及配置

nginx隐藏版本号 查看方法 浏览器F12 看network头部看server curl -i 192.168.232.7 获取头部&#xff08;查版本号&#xff09; 配置文件改 添加server_tokens off 改源码 cd /src/core vim nginx.h 修改 修改的IIS为window常用的软件服务 重新编译安装 cd nginx_1.2…

【C++】while 循环应用案例 - 猜数字游戏

目录 1、缘起 2、案例描述 3、代码 4、相关知识点 4.1、rand() 函数 4.2、srand() 函数 5、总结 1、缘起 猜数字游戏是一种简单而又有趣的游戏&#xff0c;在这个游戏中&#xff0c;计算机会生成一个随机数字&#xff0c;玩家需要通过不断猜测来猜出这个数字。在本篇博…

使用docker搭建lnmp环境+redis服务

lnmp搭建过程&#xff0c;前文已经写了传送门&#xff0c;本文主要写一下运行redis容器和php-fpm容器内安装redis扩展 redis 1.创建宿主机配置和数据文件夹 [rootlocalhost ~] mkdir -p /lnmp/redis/{data,conf}2.放置/lnmp/redis/conf/redis.conf文件 点我下载 3.启动容器 …

k8s+kubeedge+sedna安装全套流程+避坑指南+解决办法

最近在学习边缘计算要用到kubeedge&#xff0c;安装了好多次总会遇到各种各样的问题&#xff0c;因此在这里一一列出&#xff0c;以方便下次安装。则里面可能出错的地方太多&#xff0c;如果有问题&#xff0c;请私信联系。 一、环境准备 节点IP环境软件云端节点172.23.70.23…

Python|矿产卫片Excel经纬度坐标数据转换为shp点数据——OGR库实现

1.实验需求 基于Excel表格里面的经纬度坐标数据,自动生成点shp矢量文件,并添加属性信息。 2.编程思路详解 ①使用Pandas库读取原始矿产图斑列表表格; xlsx_path = uC:\\Users\\YaoJun\\Desktop\\矿产图斑列表.xlsx #sheet_name默认为0,即读取第一个sheet的数据 df = pd.…

TPM管理工作应该如何开展?

在制造行业&#xff0c;Total Productive Maintenance&#xff08;TPM&#xff09;管理被广泛认为是提高生产效率和设备可靠性的有效方式。然而&#xff0c;实施TPM管理需要深入的专业知识和经验。本文将探讨如何开展TPM管理工作&#xff0c;以确保制造企业的生产效率和设备可靠…

2023-Python实现烯牛数据采集

文章目录&#x1f449;1、目标网址&#x1f449;2、接口分析&#x1f449;3、代码实现【JS 逆向百例】 1/100 学习记录&#xff1a;哈喽~ 前面我们接触了一些JS逆向的数据获取&#xff0c;如果前面的百度&#xff0c;有道翻译和正方教务系统的登录加密你已掌握&#xff0c;说明…

计组2.4——加法器的设计

计组&#xff1a;2.4算术逻辑单元异或门实现奇偶校验的原理串行加法器&&并行加法器并行加法器的优化算术逻辑单元 控制信号&#xff1a; 当M0时表示算术运算 当M1时表示逻辑运算 S0~ S3表示做什么运算&#xff0c;因此ALU可以表示16种算数运算和16种逻辑运算 Ai,Bi代表…

PL-VINS线特征处理部分源码阅读

PL-VINS线特征处理部分源码阅读1 linefeature_tracker2 三角化单目三角化双目三角化3 后端优化线特征状态量重投影误差本文主要阅读PL-VINS中引入线特征的代码实现&#xff0c;包括线特征表示方法&#xff08;Plcker参数化方法、正交表示法&#xff09;、前端线特征提取与匹配、…