问题描述
这是一个引起我问题的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 unit)foo.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。请注意POSIX和Windows API。如果要编码widget toolkit,则可能要使用一些GUI application。您可能对跨平台框架感兴趣,例如GTK,Qt,POCO等...
一旦您认为代码正确无误,请考虑启用编译器优化(例如,通过在编译命令中添加bar.o
)
请确保没有从GCC编译器收到警告,因此请改进源代码,直到没有警告为止。
然后了解GDB调试器(阅读其文档)
在某些情况下,可能会生成某些C或C ++代码(通过bison或SWIG之类的工具)。
您可以找到build automation个工具(例如GNU make或ninja)来帮助您构建可执行文件。使用它们之前,请务必阅读其文档。
涉及许多最佳实践编码规则。我建议研究(也许有助于)一些现有开源项目。这样您将学到很多东西。
考虑然后查看open source软件的代码
例如在github或gitlab上发布的项目。通过查看其中的一些内容(例如,在GNU make,fish shell,FLTK等的代码中,您将学到很多东西)
考虑使用static source code analysis或Frama-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];
}
}
}