sbr*_*bru 0 c if-statement function conditional-statements
例如,如果我有这个:
int i = 0; // global variable (just for example... I understand these are usually frowned upon)
int foo()
{
i++;
return i;
}
int main()
{
if (foo() == 2 || foo() == 1) {
printf("hello\n");
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是这段代码会执行与下面相同的操作吗?
int i = 0; // global variable (just for example... I understand these are usually frowned upon)
int foo()
{
i++;
return i;
}
int main()
{
int rv = foo();
if (rv == 2 || rv == 1) {
printf("hello\n");
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我运行它时,它确实有所作为.我对这种情况的看法是第一个例子不会打印"hello",因为它会调用foo()函数两次.它第一次调用它将返回1和1!= 2所以它转到或的第二部分,但该部分返回2和2!= 1因此条件为假.第二个示例仅调用一次并将返回值存储在变量中,以便将相同的值与or语句的两个部分进行比较,1!= 2,但是1 == 1,因此它会进入if语句.我很好奇哪个是正确的方法,或者如果有一些编译器,优化器使这些执行相同.
此外,我写了一个多线程程序,我觉得做类似于第二个例子的事情是非常危险的,因为将返回值存储在变量中然后将该变量与您的条件进行比较并非原子.我假设第一个例子是原子的,因为if语句的两个部分都是在线程控制之前执行的.
感谢您的输入!
这些不是等效的代码片段.在第二个代码片段中,函数foo只在语句中调用一次
int rv = foo();
Run Code Online (Sandbox Code Playgroud)
在第一个代码片段foo中,一般情况下可以调用一次或两次函数,具体取决于函数的返回值
if (foo() == 2 || foo() == 1) {
Run Code Online (Sandbox Code Playgroud)
对于这种特殊情况,函数 foo将被调用两次,条件的结果将是false在第一次调用之后函数将返回1. 1不等于2.因此该函数将被第二次调用.它将返回2并再次2不等于1.因此条件的结果将是false.
在第二个代码片段中,条件将等于 true
在第一个代码片段中,i的结果值将等于2,而在第二个代码片段中,i的结果值将等于1.
因此,代码片段的条件结果值和全局变量i的结果值不同.
编写代码的哪种方式是正确的取决于您的意图.由于你没有说出你想要实现的目标,因此很难回答.