微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C ++ If / Else If / Else块-始终掉入Else块 您还应该对this C和C ++参考网站感兴趣

如何解决C ++ If / Else If / Else块-始终掉入Else块 您还应该对this C和C ++参考网站感兴趣

这是一个引起我问题的C / C ++代码段。由于某些原因,即使'if'或'else if'块中的条件为true,代码也会始终放入'else'块中。如果我将“ else”块替换为另一个“ else if”块,则上一个“ if”或“ if else”块中的代码将正常运行(如果条件为真)!如果我只是完全删除最后一个块,则前两个块中的代码也将运行。

有人可以告诉我这是怎么回事吗?

for (i = 0; i < text_len; i++)
{
    for (j = 0; j < 26; j++)
    {
        if (text[i] == alphabet[j])
        {
            coded_text[i] = cipher[j];
        }
        else if(text[i] == (alphabet[j] - 32))
        {
            coded_text[i] = (cipher[j] - 32);
        }
        else
        {
            coded_text[i] = text[i];
        }
    }
}

解决方法

第一个C和C ++是 programming languages,具有不同的规范。

对于C,请在n1570上阅读其规范(C11标准)。

对于C ++,请在n3337上阅读其规范(C ++ 11标准)。

您还应该对this C和C ++参考网站感兴趣。

您需要阅读书籍(不同的书籍)以学习每种语言。如果您学习C,请阅读Modern C。如果您学习C ++,请阅读Programming -- Principles and Practice Using C++

请注意,C和C ++的语法和semantics不同。更糟的是,由于C ++具有exceptions和重载,因此C ++行的语义与C行的语义不同(您的示例可能是C或C ++代码)。

使用调试器了解程序的行为

如果您使用GCC作为编译器(阅读其文档,请注意它可以同时编译C和C ++代码),则可以使用所有警告和调试信息来编译代码。

对于C文件(实际上是translation unitfoo.c,您可以使用gcc -Wall -Wextra -g foo.c对其进行编译(可能添加-c -o foo.o以获得一些object file {{1} })

对于C ++文件(翻译单元)foo.o,您可以使用bar.cc对其进行编译(可能添加g++ -Wall -Wextra -g bar.cc以获得object file -c -o bar.o)>

稍后,您将使用linker来获取executable(甚至可以谨慎地混合使用C和C ++代码)。该链接器可能是binutils,您需要阅读其文档。

实际上,除了您的语言libraries之外,您还可能会使用某些其他软件standard library (请注意,C和C ++具有不同标准库)。特别是,大多数操作系统都提供一些特定于OS的库和API。请注意POSIXWindows API。如果要编码widget toolkit,则可能要使用一些GUI application。您可能对跨平台框架感兴趣,例如GTKQtPOCO等...

一旦您认为代码正确无误,请考虑启用编译器优化(例如,通过在编译命令中添加bar.o

请确保没有从GCC编译器收到警告,因此请改进源代码,直到没有警告为止。

然后了解GDB调试器(阅读其文档)

在某些情况下,可能会生成某些C或C ++代码(通过bisonSWIG之类的工具)。

您可以找到build automation个工具(例如GNU makeninja)来帮助您构建可执行文件。使用它们之前,请务必阅读其文档。

涉及许多最佳实践编码规则。我建议研究(也许有助于)一些现有开源项目。这样您将学到很多东西。

考虑然后查看open source软件的代码

例如在githubgitlab上发布的项目。通过查看其中的一些内容(例如,在GNU makefish shell,FLTK等的代码中,您将学到很多东西)

考虑使用static source code analysisFrama-C之类的Clang static analyzer工具

,

如果发现了真实情况,我会忽略内循环。

for (i = 0; i < text_len; i++)
{
    for (j = 0; j < 26; j++)
    {
        if (text[i] == alphabet[j])
        {
            coded_text[i] = cipher[j];
            break;
        }
        else if(text[i] == (alphabet[j] - 32))
        {
            coded_text[i] = (cipher[j] - 32);
            break;
        }
        else
        {
            coded_text[i] = text[i];

        }
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。