我想做以下事情:
r = recv(socket, buffer, bufsize, 0) && return r;
不起作用,因为return -r;
不是表达式。但是,
r = recv(socket, buffer, bufsize, 0) && printf("r=%d\n", r);
似乎有效。现在,除了语法简洁之外,还有很多东西可以从中获益但是我仍然很好奇是否有办法实现实际编译的&& return r;
的功能?
编辑:如果不清楚,当且仅当第一个非零时,才应执行&&
之后的表达式。
答案 0 :(得分:8)
&&&当且仅当第一个非零时才应执行。
以下是您的问题:表达式没有执行,它们是评估的。声明已经执行。
表达式可能会在评估期间发生副作用,但它们总是评估为某个值。如您所知,return
是语句而不是表达式。
所以,简而言之,不,你没有办法做你想做的事。
答案 1 :(得分:2)
printf()
在语法上是expression
(函数调用),而return __
是jump-statement
。
运算符&&
需要2个expression
类型的操作数,这就是拒绝代码的原因。
查看Appendix A
中的ISO 9899
。
答案 2 :(得分:1)
是的,这是可能的。
r = recv(socket, buffer, bufsize, 0);
if (r != 0)
{
return r;
}
如果你正在寻找比这更复杂的东西,那你做错了。优秀的程序员力求简单,糟糕的程序员努力进行混淆。
答案 3 :(得分:-1)
这是一个糟糕的想法,但只是因为你想要它,在这里你去
r = recv(socket, buffer, bufsize, 0) && (({return r;}),0);
这将按您的意愿工作。
如果需要,我可以解释发生了什么。 我再说一遍是个坏主意。
除了一个坏主意之外,此解决方案还使用名为 - Statement-expressions的gcc扩展名。所以这个答案在编译器中是不可移植的。