2012-03-15 59 views
0

考虑下面的代码:++返回表达式用C

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语句可以使用其他表达式?

我在使用逗号的大多是疑惑,想知道这个表达式语法定义(我不知道它的存在,我也不会知道在哪里可以找到)。我能用无限多的代码填充最后一个表达式吗?如果是的话,有什么限制,要求等?

+2

为什么你认为它不应该被允许的? – 2012-03-15 00:43:18

+0

顺便说一下三元运算符'? :'不是'if'的简写。 'if'允许有条件地执行代码(任何代码)。三元运算符**根据条件返回**两个值之间的一个值。 – 2012-03-15 00:45:10

+0

对不起,一个完全不正确的标题,因为我发布之前忘了修改它。 – skippr 2012-03-15 00:47:00

回答

1

逗号操作符可以让您两组否则无关的表情。两个表达式总是被评估,结果是第二个表达式的结果。使用它几乎总是一个糟糕的主意(因为它只是为了保存一行代码而伤害可读性),除了可能在for循环的顶部。

+0

啊,COMMA OPERATOR。现在一切都说得通了。我不知道我的问题最初在哪里,因为我不知道操作员是否存在。这导致我:http://stackoverflow.com/questions/54142/c-comma-operator – skippr 2012-03-15 01:12:43

0

,是一个运算符,就像+<<一样,所以几乎可以在任何需要表达式的地方使用它。例外情况是逗号需要具有不同含义的上下文,例如在函数调用中。在这样的背景下,你必须通过添加一组额外的括号中的歧义逗号:

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: "之前,同时使用尽可能少的线路尽可能调用validateEntry()。当然,整个功能只是一种“聪明”的方式,可以反复询问输入,直到获得有效的输入。 IMO的循环会比递归更好。

0

? :是C++

其语法的唯一三元opeartor是logical-or-expression ? expression : conditional-expression

可以进一步了解它在MSDN

1
return [expression]; 

expression : 
    expression , expression 
    literal 
    etc... 

逗号操作符在一行分隔的多个表达式。当用于类似return语句的赋值语句(赋值返回的临时值)时,只分配最右边的值。前面的表达式从左到右执行。在你的例子中,返回最终的函数调用返回值。

我使用这种技术来清除故障的正式参数变量。尤其是COM例程出现故障。例如:

HRESULT func(..., IInterface **ppv) 
{ 
... 
If(!good) 
    return (*ppv = 0), E_FAIL; 
... 
}