0

考虑以下代码:

float validateEntry()
{
    string entry;
    float value;

    getline(cin, entry);
    value = atof(entry.data());

    return ((isNumber(entry) && value >= 0) ? i
    : (cout << "Enter valid amount: ", validateEntry())
}

为什么允许最后一行(逗号分隔的表达式),还有其他表达式可以与 C++ 中的 return 语句一起使用吗?

我对逗号的使用很困惑,想知道这个表达式语法是在哪里定义的(我不知道它存在,也不知道在哪里可以找到)。我可以用无限量的代码填充最后一个表达式吗?如果有,有哪些限制、要求等?

4

4 回答 4

1

逗号运算符允许您对两个原本不相关的表达式进行分组。两个表达式总是被计算,结果是第二个表达式的结果。使用它几乎总是一个坏主意(因为它只是为了节省一行代码而损害了可读性),除非可能在 for 循环的顶部。

于 2012-03-15T01:04:53.443 回答
1
return [expression];

expression :
   expression , expression
   literal
   etc...

The comma operator separates multiple expressions on a single line. When used in an assignment statement like the return statement (assigning a temporary value which is returned), only the rightmost value is assigned. The preceding expressions are executed from left to right. In your example, the final function call returned value is returned.

I use this technique to clear formal argument variables on failure. Especially COM routines where there is a failure. For example:

HRESULT func(..., IInterface **ppv)
{
...
If(!good)
  return (*ppv = 0), E_FAIL;
...
}
于 2012-05-20T16:10:41.690 回答
0

,是一个类似于+or的运算符,<<因此您几乎可以在任何需要表达式的地方自由使用它。例外是预期逗号具有不同含义的上下文,例如在函数调用中。在这种情况下,您必须通过添加一组额外的括号来消除逗号的歧义:

foo((b,c)); // call foo with a single argument

您显示的语句相当于:

// return ((isNumber(entry) && value >= 0) ? i : (cout << "Enter valid amount: ", validateEntry())

if(isNumber(entry) && value >= 0) {
    return i;
} else {
    cout << "Enter valid amount: ";
    return validateEntry();
}

这只是在使用尽可能少的行的同时有条件地执行cout << "Enter valid amount: "before 调用的一种“聪明”方式。validateEntry()当然,整个函数只是重复请求输入直到获得有效输入的“聪明”方式。IMO 循环会比这里的递归更好。

于 2012-03-15T01:15:26.367 回答
0

? :是 C++ 唯一的三元运算符

它的语法是logical-or-expression ? expression : conditional-expression

您可以在MSDN上阅读有关它的更多信息

于 2012-03-15T04:38:10.647 回答