Visual Studio 跳过多个 if 语句?

Posted

技术标签:

【中文标题】Visual Studio 跳过多个 if 语句?【英文标题】:Visual Studio skipping multiple if statements? 【发布时间】:2019-12-28 01:27:22 【问题描述】:

我正在制作一个生成迷宫的简单迷宫程序。目前,当我偶然发现一些奇怪的东西时,我正在努力为迷宫制作一个也是唯一的解决方案。当我调试这段代码时,我看到 VS 只是在这里跳过了我的 if 语句:

        for (i = 0; i <= (col * row) / 200; i++)
        
        solution[se[0]][se[1]] = 1;
        if (lab[se[0] + 1][se[1]]) se[0] + 1;
        else if (lab[se[0]][se[1] + 1]) se[1] + 1;
        else if (lab[se[0] - 1][se[1]]) se[0] - 1;
        else if (lab[se[0]][se[1] - 1]) se[1] - 1;

        solution[se[2]][se[3]] = 1;
        if (lab[se[2] - 1][se[3]]) se[2] - 1;
        else if (lab[se[2]][se[3] - 1]) se[3] - 1;
        else if (lab[se[2] + 1][se[3]]) se[2] + 1;
        else if (lab[se[2]][se[3] + 1]) se[3] + 1;
        

我希望它不是重复的,但我不知道这里有什么问题,所以它可能是一个。

如果有人想复制问题,这里是完整的代码:

#include <stdio.h>
#include <iostream>
#include <Windows.h>
#include <string>

CONSOLE_SCREEN_BUFFER_INFO csbi;
int **lab, **solution;
int col, row, i, j;

int main() 
    GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi);
    col = csbi.srWindow.Right - csbi.srWindow.Left; row = csbi.srWindow.Bottom - csbi.srWindow.Top + 1; i = 0; j = 0;
    lab = new int* [row];
    for (i = 0; i < row; ++i)
        lab[i] = new int[col];
    solution = new int* [row];
    for (i = 0; i < row; ++i)
        solution[i] = new int[col];

    for (i = 0; i < row; i++)            // Build basic maze
        for (j = 0; j < col; j++) 
            if (i == 0) lab[i][j] = 0;
            else if (i == j == 1) lab[i][j] = 1;
            else if (i == 1 && j == col - 1) lab[i][j] = 1;
            else if (i == row - 1) lab[i][j] = 0;
            else if (j == 0) lab[i][j] = 0;
            else if (j == col - 1) lab[i][j] = 0;
            else 
                if (lab[i - 1][j] == 0) lab[i][j] = rand() % 2;
                else 
                    if (lab[i - 1][j - 1] + lab[i - 1][j + 1] + lab[i - 2][j] <= 1) lab[i][j] = 1;
                    else 
                        lab[i][j] = rand() % 2;
                    
                
            
        
    

    int se[4] =  1,1,1,col - 1 ;

    for (i = 0; i <= (col * row) / 200; i++)        // Generate a solution
    
        solution[se[0]][se[1]] = 1;
        if (lab[se[0] + 1][se[1]]) se[0] + 1;
        else if (lab[se[0]][se[1] + 1]) se[1] + 1;
        else if (lab[se[0] - 1][se[1]]) se[0] - 1;
        else if (lab[se[0]][se[1] - 1]) se[1] - 1;

        solution[se[2]][se[3]] = 1;
        if (lab[se[2] - 1][se[3]]) se[2] - 1;
        else if (lab[se[2]][se[3] - 1]) se[3] - 1;
        else if (lab[se[2] + 1][se[3]]) se[2] + 1;
        else if (lab[se[2]][se[3] + 1]) se[3] + 1;
    
    while (se[0] != se[2] || se[1] != se[3])
    
        if (se[0] < se[2])
        
            if (lab[se[2] - 1][se[3]]) se[2] - 1;
            if (lab[se[0] + 1][se[1]]) se[0] + 1;
        
        if (se[1] < se[3])
        
            if (lab[se[2]][se[3] - 1]) se[3] + 1;
            if (lab[se[0]][se[1] + 1]) se[1] + 1;
        
        solution[se[0]][se[1]] = 1;
        solution[se[2]][se[3]] = 1;
    


    std::string out;
    for (i = 0; i < row; i++)             // Print maze
        for (j = 0; j < col; j++) 
            if (solution[i][j]==1) out.append("@");
            else if (!lab[i][j]) out.append("#");
            else out.append(" ");;
        
        std::cout << out << '\n';
        out="";
    

    system("pause");

    for (i = 0; i < row; ++i) delete[] lab[i];
    delete[] lab;

对不起,这段代码一团糟,因为它仍在进行中。

顺便说一句,我正在使用 VS 2019,还没有在其他编译器中尝试过。真的是编译器的错吗?

【问题讨论】:

“这段代码一团糟,因为它仍在进行中”......只是一个友好的建议:从一开始就“正确”地做。它使迭代开发变得更加容易.. 【参考方案1】:

编译器认为适合“跳过”if 块的原因是因为其中没有任何代码!

例如在语句中:

if (lab[se[0] + 1][se[1]]) se[0] + 1;

当测试中的条件为“真”时会发生什么? se[0] + 1 语句实际上并没有修改任何内容 - 它只是一个具有给定值的表达式。

可能想要的是给se[0]加1,所以你需要这个:

if (lab[se[0] + 1][se[1]]) se[0] += 1;

对于其他 ifelse if 行也是如此。 (注意添加的= 字符!)

【讨论】:

以上是关于Visual Studio 跳过多个 if 语句?的主要内容,如果未能解决你的问题,请参考以下文章

我可以让 Visual Studio 将花括号与 if 语句(在 HTML 中)放在同一行吗?

Visual Studio 跳过代码行

Visual Studio C# 语句崩溃

为啥 Visual Studio 在调试时会跳过我的方法?

Visual Studio 2015:调试器不会跳过

在Visual Studio 2012中使用MSBuild PublishProfile时,MSDeploy跳过规则