laj*_*jos 72 variable-assignment conditional-statements
在许多语言中,作业在条件上是合法的.我从来不明白这背后的原因.你为什么要写:
if (var1 = var2) {
...
}
Run Code Online (Sandbox Code Playgroud)
代替:
var1 = var2;
if (var1) {
...
}
Run Code Online (Sandbox Code Playgroud)
Ger*_*ald 105
它比if语句更有用于循环.
while( var = GetNext() )
{
...do something with var
}
Run Code Online (Sandbox Code Playgroud)
否则必须写
var = GetNext();
while( var )
{
...do something
var = GetNext();
}
Run Code Online (Sandbox Code Playgroud)
Jon*_*ler 31
我觉得它在行动链中最有用,通常涉及错误检测等.
if ((rc = first_check(arg1, arg2)) != 0)
{
report error based on rc
}
else if ((rc = second_check(arg2, arg3)) != 0)
{
report error based on new rc
}
else if ((rc = third_check(arg3, arg4)) != 0)
{
report error based on new rc
}
else
{
do what you really wanted to do
}
Run Code Online (Sandbox Code Playgroud)
替代方案(不使用条件中的赋值)是:
rc = first_check(arg1, arg2);
if (rc != 0)
{
report error based on rc
}
else
{
rc = second_check(arg2, arg3);
if (rc != 0)
{
report error based on new rc
}
else
{
rc = third_check(arg3, arg4);
if (rc != 0)
{
report error based on new rc
}
else
{
do what you really wanted to do
}
}
}
Run Code Online (Sandbox Code Playgroud)
通过长时间的错误检查,替代方案可以运行页面的RHS,而条件分配版本不会这样做.
Chr*_*ung 29
如果你正在调用一个函数,它会更有用:
if (n = foo())
{
/* foo returned a non-zero value, do something with the return value */
} else {
/* foo returned zero, do something else */
}
Run Code Online (Sandbox Code Playgroud)
当然,你可以把n = foo(); 在一个单独的声明然后if(n),但我认为上面是一个相当可读的习语.
Mic*_*urr 23
如果您正在调用返回要处理的数据的函数或指示错误的标志(或您已完成),那么它将非常有用.
就像是:
while ((c = getchar()) != EOF) {
// process the character
}
// end of file reached...
Run Code Online (Sandbox Code Playgroud)
就个人而言,这是一个我不太喜欢的习语,但有时替代方案更加丑陋.
Jes*_*erE 11
如果您无意中尝试将赋值用作真值,GCC可以帮助您检测(使用-Wall),以防它建议您编写
if ((n = foo())) {
...
}
Run Code Online (Sandbox Code Playgroud)
即使用额外的括号表示这确实是你想要的.
当你编写while循环而不是if语句时,这个习惯用法更有用.对于if声明,您可以按照描述进行分解.但是如果没有这种结构,你要么必须重复自己:
c = getchar();
while (c != EOF) {
// ...
c = getchar();
}
Run Code Online (Sandbox Code Playgroud)
或使用循环结构:
while (true) {
c = getchar();
if (c == EOF) break;
// ...
}
Run Code Online (Sandbox Code Playgroud)
我通常更喜欢循环半形式.