更改if范围内变量的类型

Change type of a variable inside an if scope

本文关键字:类型 变量 范围内 if 更改      更新时间:2023-10-16
#include <iostream>
int main(){
    for (int i = 1; i <=5; i++){
    if (i == 3)
        char i[3] = "abc";
    std::cout << i << "n";
    }
}

输出:

1
2
3
4
5

因此,问题是char i[3]仅在IF内部范围内范围范围内,如果我尝试在if句子中 cout它会像预期的那样打印 "abc",但是在句子之外,如果句子不起作用,我可以称其为不粘。因此,我该如何声明它,以便它在if句子之外工作,而我不想在if句子中添加 cout,而我不想在for循环中更改 cout,因为在我的实际程序上,我正在打印桌子。


更新:这是我的实际代码:

#include <iostream>
#include <iomanip>
#include <cmath>
#define pi 3.14159265359
double d2r(int deg) {
    double rad = (pi * deg) / 180;
    return rad;
}
int main() {
    int sw = 2;
    cout << "Deg" << "t" 
        << "Sin" << "t"
        << "Cos" << "t"
        << "Tan" << "t"
        << "n";
    for (int deg = 2; deg <= 90; deg += 2) {
        double A = sin(d2r(deg));
        double B = cos(d2r(deg));
        double C = tan(d2r(deg));
        if (abs(B) < 0.00009)
            B = 0;
        if (abs(C) > 100)
            char C[4] = "Inf";
        cout << setprecision(3) << fixed
            << deg << setw(sw) << "t"
            << A << setw(sw) << "t"
            << B << setw(sw) << "t"
            << C << setw(0) << "n";
    }
}

您无法像尝试一样更改C的类型。您需要针对不同数据类型的单独的cout <<语句,例如:

cout << setprecision(3) << fixed
     << deg << setw(sw) << "t"
     << A << setw(sw) << "t"
     << B << setw(sw) << "t";
if (abs(C) > 100)
    cout << "Inf";
else
    cout << C;
/* alternatively:
(abs(C) > 100) ? (cout << "Inf") : (cout << C);
*/
cout << setw(0) << "n";

另外,根据所需的任何条件格式化 std::string,然后输出该字符串,例如:

std::ostringstream oss;
if (abs(C) > 100)
    oss << "Inf";
else
    oss << setprecision(3) << fixed << C;
/* alternatively:
(abs(C) > 100) ? (oss << "Inf") : (oss << setprecision(3) << fixed << C);
*/
cout << setprecision(3) << fixed
     << deg << setw(sw) << "t"
     << A << setw(sw) << "t"
     << B << setw(sw) << "t"
     << oss.str() << setw(0) << "n";

您可以写自己的I/O操纵器,例如:

#include <iostream>
#include <iomanip>
#include <cmath>
#define pi 3.14159265359
double d2r(int deg) {
    double rad = (pi * deg) / 180;
    return rad;
}
struct inf_if_greater_magnitude
{
    inf_if_greater_magnitude(double val, double limit) : val(val), limit(limit) {}
    friend std::ostream& operator<<(std::ostream&os, inf_if_greater_magnitude const& iig)
    {
        if (std::isinf(iig.val) or std::isnan(iig.val) or (std::abs(iig.val) > iig.limit))
            return os << "Inf";
        else
            return os << iig.val;
    }
    double val;
    double limit;
};
int main() {
    using namespace std;
    int sw = 2;
    cout << "Deg" << "t" 
        << "Sin" << "t"
        << "Cos" << "t"
        << "Tan" << "t"
        << "n";
    for (int deg = 2; deg <= 90; deg += 2) {
        double A = sin(d2r(deg));
        double B = cos(d2r(deg));
        double C = tan(d2r(deg));
        if (abs(B) < 0.00009)
            B = 0;
        cout << setprecision(3) << fixed
            << deg << setw(sw) << "t"
            << A << setw(sw) << "t"
            << B << setw(sw) << "t"
            << inf_if_greater_magnitude(C, 100) << "n";
    }
}

预期结果:

...
84  0.995   0.105   9.514
86  0.998   0.070   14.301
88  0.999   0.035   28.636
90  1.000   0.000   Inf

http://coliru.stacked-crooked.com/a/0da21c8ef5579f95

进一步的重构可以给您类似的东西:

#include <iostream>
#include <iomanip>
#include <cmath>
#define pi 3.14159265359
double d2r(int deg) {
    double rad = (pi * deg) / 180;
    return rad;
}
struct output_tan
{
    output_tan(double val) : val(val) {}
    friend std::ostream& operator<<(std::ostream&os, output_tan const& iig)
    {
        if (std::isinf(iig.val) 
         or std::isnan(iig.val) 
         or (std::abs(iig.val) > 100))
            return os << "Inf";
        else
            return os << iig.val;
    }
    double val;
};
struct output_cos
{
    output_cos(double val) : val(val) {}
    friend std::ostream& operator<<(std::ostream&os, output_cos const& iig)
    {
        auto v = iig.val;
        if (v < 0.00009) v = 0;
        return os << v;
    }
    double val;
};
int main() {
    using namespace std;
    int sw = 2;
    cout << "Deg" << "t" 
        << "Sin" << "t"
        << "Cos" << "t"
        << "Tan" << "t"
        << "n";
    for (int deg = 2; deg <= 90; deg += 2) {
        cout << setprecision(3) << fixed
            << deg << setw(sw) << "t"
            << sin(d2r(deg)) << setw(sw) << "t"
            << output_cos(cos(d2r(deg))) << setw(sw) << "t"
            << output_tan(tan(d2r(deg))) << "n";
    }
}