假设我有这个伪代码:
bool conditionA = executeStepA();
if (conditionA){
bool conditionB = executeStepB();
if (conditionB){
bool conditionC = executeStepC();
if (conditionC){
...
}
}
}
executeThisFunctionInAnyCase();
Run Code Online (Sandbox Code Playgroud)
executeStepX当且仅当前一个成功时才应执行函数.无论如何,executeThisFunctionInAnyCase应该在最后调用该函数.我是编程的新手,对于这个非常基本的问题感到抱歉:有没有办法(例如在C/C++中)避免长if链产生那种"代码金字塔",代价是代码易读性?
我知道如果我们可以跳过executeThisFunctionInAnyCase函数调用,代码可以简化为:
bool conditionA = executeStepA();
if (!conditionA) return;
bool conditionB = executeStepB();
if (!conditionB) return;
bool conditionC = executeStepC();
if (!conditionC) return;
Run Code Online (Sandbox Code Playgroud)
但约束是executeThisFunctionInAnyCase函数调用.该break声明是否可以某种方式使用?
close()我使用时需要手动拨打电话std::ifstream吗?
例如,在代码中:
std::string readContentsOfFile(std::string fileName) {
std::ifstream file(fileName.c_str());
if (file.good()) {
std::stringstream buffer;
buffer << file.rdbuf();
file.close();
return buffer.str();
}
throw std::runtime_exception("file not found");
}
Run Code Online (Sandbox Code Playgroud)
我需要file.close()手动拨打电话吗?不应该ifstream使用RAII来关闭文件?
我正在从Java过渡到C++,并对long数据类型有一些疑问.在Java中,要保存大于2 32的整数,您只需编写long x;.但是,在C++中,它似乎long既是数据类型又是修饰符.
似乎有几种使用方法long:
long x;
long long x;
long int x;
long long int x;
Run Code Online (Sandbox Code Playgroud)
此外,似乎有一些事情,如:
long double x;
Run Code Online (Sandbox Code Playgroud)
等等.
所有这些不同的数据类型之间有什么区别,它们都有相同的目的吗?
假设我正在启动a std::thread然后detach()它,所以线程继续执行,即使std::thread它曾经表示它,超出范围.
进一步假设该程序不具有用于接合分离的线程一个可靠的协议1,所以分离线程仍然运行时main()退出.
我在标准中找不到任何东西(更准确地说,在N3797 C++ 14草案中),它描述了应该发生的事情,1.10和30.3都没有包含相关的措辞.
1另一个可能是等同的问题是:"可以再次连接一个分离的线程",因为你要发明加入的协议,信号部分必须在线程仍在运行时完成,并且OS调度程序可能决定在执行信令之后让线程休眠一小时,接收端无法可靠地检测到线程实际完成.
如果用完main()了卸下运行的线程是不确定的行为,那么任何使用的std::thread::detach()是除非主线程永远不会退出未定义行为2.
因此,运行main()脱离线程的耗尽必须具有已定义的效果.问题是:其中(在C++标准,不POSIX,不OS文档,......)都处于所定义的那些的效果.
2分离的线程不能加入(在感std::thread::join()).您可以等待分离线程的结果(例如,通过未来std::packaged_task,或通过计数信号量或标志和条件变量),但这并不能保证线程已完成执行.事实上,除非你把信令部分进入线程的第一个自动对象的析构函数,也将在一般情况下,是运行的代码(析构函数)后的信号代码.如果操作系统安排主线程使用结果并在分离的线程完成运行所述析构函数之前退出,^ Wis定义会发生什么?
这是一个简单的问题,但我一直看到相互矛盾的答案:C++程序的主程序应该返回0还是EXIT_SUCCESS?
#include <cstdlib>
int main(){return EXIT_SUCCESS;}
Run Code Online (Sandbox Code Playgroud)
要么
int main(){return 0;}
Run Code Online (Sandbox Code Playgroud)
它们是完全相同的吗?应该EXIT_SUCCESS只与exit()?一起使用?
我认为EXIT_SUCCESS这是一个更好的选择,因为其他软件可能想要将零视为失败,但我也听说如果你返回0,编译器无论如何都能够将它改为不同的值.
我想从文本文件中读取文本.在下面的代码中,发生异常(这意味着它进入catch块).我把文本文件放在应用程序文件夹中.我应该把这个文本文件(mani.txt)放在哪里才能正确读取它?
try
{
InputStream instream = openFileInput("E:\\test\\src\\com\\test\\mani.txt");
if (instream != null)
{
InputStreamReader inputreader = new InputStreamReader(instream);
BufferedReader buffreader = new BufferedReader(inputreader);
String line,line1 = "";
try
{
while ((line = buffreader.readLine()) != null)
line1+=line;
}catch (Exception e)
{
e.printStackTrace();
}
}
}
catch (Exception e)
{
String error="";
error=e.getMessage();
}
Run Code Online (Sandbox Code Playgroud) 阅读手册页和一些代码并没有真正帮助我理解它们之间的区别 - 或者更好,当我应该使用 - perror("...")或者fprintf(stderr, "...").
我正在为我的iOS应用安装Crashlytics.我通过他们的站点链接下载了它,并完成了集成框架,添加运行脚本等所有步骤.
我遇到了一个问题,所以我删除了框架并决定重新开始并尝试重新安装.但Fabric应用程序更新到更新版本,现在当我尝试将Crashlytics重新安装到我的应用程序时,它不会让我选择重新安装框架.它直接点击"安装"到"构建你的项目"屏幕,我无法通过.
要帮助配置项目,请按⌘B立即构建项目
我按⌘B,它建立,没有任何反应.我认为问题是因为我从我的项目中删除了Crashlytics和Fabric框架,但我看不到再次添加它们的方法.Fabric应用程序没有给我这个选项.
我已经安装了SQL Server 2008 Express Edition,但是我错误地保留了Windows身份验证模式.
现在我想将其更改为SQL Server混合模式.我怎样才能做到这一点?
c++ ×5
c ×3
android ×1
c++11 ×1
control-flow ×1
crashlytics ×1
exit ×1
if-statement ×1
ifstream ×1
inputstream ×1
ios ×1
java ×1
long-integer ×1
raii ×1
return-value ×1
sql-server ×1
stderr ×1
stdthread ×1
type-safety ×1
xcode ×1