实际初始化的未初始化局部变量? [复制]

Posted

技术标签:

【中文标题】实际初始化的未初始化局部变量? [复制]【英文标题】:Uninitialized local variable that is actually initialized? [duplicate] 【发布时间】:2016-09-27 23:37:49 【问题描述】:

我正在编写一个处理输入文件中的值的程序。我的变量包括总计、税收总计、小计等,并且它们已经被声明和初始化,但我收到两条错误消息:“使用未初始化的局部变量 'subtotal'”和变量“taxtotal”相同。

这是我的源代码:

#include "stdafx.h"
#include<stdio.h>
#include <fstream>
#include <iostream>
#include <iomanip>
#include <string>
using namespace std;

int main()


    ifstream shoppingBasketFile;
    shoppingBasketFile.open("HW3_Data.txt");
    bool isTaxed = false;
    char taxValue = 0;
    char inPrice[64];
    char name[128];
    double price, taxtotal, subtotal, total = 0;

    if (shoppingBasketFile.is_open())
    
        // display the header info:
        cout << "o  Thank you for shopping at StuffMart" << endl;
        cout << setw(3) << left << "o  "
            << setw(20) << left << "Item"
            << setw(12) << "Unit Price"
            << setw(4) << "Tax"
            << endl
        << "o -------------------------------------" << endl;
        // parse the input file until end of file;
        while (!shoppingBasketFile.eof())
        
    
            // parse the item name:
            shoppingBasketFile >> name;
            cout << "Name = " << name << endl;
            if (name == NULL)
            
        
                // what should we really do here?
                continue;
            
            

            // parse the price:
            shoppingBasketFile >> price;
            if (price < 0 || price > 100000000000) 
                continue;
            
            cout << "Price = " << price << endl;

            // parse the isTax flag:
            shoppingBasketFile >> isTaxed;
            shoppingBasketFile >> taxValue;
            cout << "Is taxed? = " << taxValue << endl;
            // if end of file break out of this loop:
            if (!shoppingBasketFile.good()) break;
            if (isTaxed == true) 
                taxtotal = taxtotal + (.085 * price);
                taxValue = 'Y';
            
            else 
                taxValue = 'N';

            
            //display tax as Y instead of T/1
            if (isTaxed == true) 
                cout << "Tax: Y" << endl;
            
            else 
                cout << "Tax: N" << endl;
            
            //compute the subtotals
            subtotal = subtotal + price;
            // display the item info:      
            cout << "name" << name << ", price: $" << price << ", is taxed: " << taxValue << endl;
            

            // reset input values:
            name, price, isTaxed = 0;
            // end of while loop
        
        //compute the final total:
        total = subtotal + taxtotal;
        //output the totals
        cout << "o" << setw(37) << "---------------" << endl
            << "o " << setw(26) << "Subtotal  $" << fixed << setprecision(2) << right << subtotal << endl
            << "o " << setw(26) << "Tax (8.5%) $" << fixed << setprecision(2) << right << taxtotal << endl
            << "o " << setw(26) << "Total $" << fixed << setprecision(2) << right << total << endl;
    


shoppingBasketFile.close();
return 0;

如何消除这些错误消息?如果这很重要,我正在使用 Microsoft 的 Visual C++ 编译器。

【问题讨论】:

“它们已经被声明和初始化”这些变量没有被初始化。 另见***.com/questions/5605125/… 就像未来的调试技巧一样,您可以通过逐个删除程序的位直到错误消失(或者您只剩下一个小sn-p)来探索这些类型的问题)。这有助于删除无关的代码位,这可能是您的问题被否决的来源。例如:coliru.stacked-crooked.com/a/5411adedef6dce85。如果您此时不知道答案,那么既然您有MVCE,请随时提出问题。 double price, taxtotal, subtotal, total = 0; 行之后的内容与您的问题无关。最好将您的代码范围缩小到一个显示问题的小型独立示例。阅读:minimal reproducible example. 你会发现你在这里遇到了同样的问题:name, price, isTaxed = 0;。阅读文本中的逗号运算符。更多信息在这里:***.com/questions/54142/… 【参考方案1】:

在此声明中:

double price, taxtotal, subtotal, total = 0;

类型名称 double 适用于所有 4 个变量,但 = 0 初始化仅适用于 total

正如其他人所说,最直接的解决方法是:

double price = 0, taxtotal= 0, subtotal = 0, total = 0;

但最好在单独的行中声明每个变量:

double price    = 0.0;
double taxtotal = 0.0;
double subtotal = 0.0;
double total    = 0.0;

请注意,使用0 是完全有效的(int 值将隐式转换为double0.0),但使用浮点常量更为明确。

(我选择垂直对齐初始化器。有些人可能不喜欢这样做。)

我猜你还没有得到指针。当你这样做时,你会遇到另一个在自己的行上声明每个变量的原因。这个:

int* x, y, z;

x 定义为int*,但将yz 定义为int。对于上面的初始化程序,每行使用一个声明,避免了这种错误和混乱的机会:

int* x;
int* y;
int* z;

一旦你编译了你的代码,你就会遇到这行的问题:

name, price, isTaxed = 0;

这是一个有效的陈述,但它并没有做你认为它做的事情。

,逗号运算符。它按顺序计算其左操作数和右操作数,并产生右操作数的值,丢弃左操作数的值。该语句评估并丢弃name 的当前值,然后评估并丢弃price 的当前值,然后将值0 分配给isTaxed。 (感谢 user4581301 指出这一点。)

你可以这样写:

name = price = isTaxed = 0;

(因为赋值产生了被赋值的值),或者更简单地说,为:

// name = 0;
price = 0.0
isTaxed = false;

我已经注释掉了对name 的赋值,因为它是一个数组,你不能给数组对象赋值。我不会显示更正的版本,因为我不知道您在这里要做什么。

建议:从小处着手,保持简单,并在每一步确认您的代码工作,然后再添加新代码。我认为您试图一次编写太多代码。您有近 100 行甚至无法编译的代码。我已经编程了很长时间,如果不确保它可以编译和运行,我不会写那么多代码。

【讨论】:

【参考方案2】:

您在此处的声明中声明 subtotal

double price, taxtotal, subtotal, total = 0;

但只有 初始化 total 的值为 0,导致在赋值右侧使用它会触发错误:

subtotal = subtotal + price;

要初始化多个项目,只需显式添加“=”。 示例:

double price = 0, taxtotal = 0, subtotal = 0, total = 0;

【讨论】:

行得通!实际上,我确实曾经尝试过,但我遇到了另一个错误,阻碍了我获得足够的结果。对 C++ 还是很陌生,所以感谢您帮助我排除故障! :)

以上是关于实际初始化的未初始化局部变量? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

C++11中的局部静态变量初始化线程安全吗? [复制]

成员变量 局部变量

C语言基础:作用域规则(局部变量,全局变量,形式参数)全局变量与局部变量在内存中的区别初始化局部变量和全局变量

JVM常用指令

成员变量和局部变量的区别

静态局部变量