我很长一段时间都在编码,虽然我还是一名学生程序员/我通常擅长编程,但当问到下面的问题时,我会陷入困境。以下程序的输出和原因是什么?
int main()
{
int i=4,j=-1,k=0,w,x,y,z;
w=i||j||k;
print("%d",w);
return 0;
}
输出:
1
为什么这个结果?陈述w=||j||k;
的含义是什么?
答案 0 :(得分:3)
i || j || k
从左到右进行评估。它做到了:
i == 4
,这是真的,因此将其与任何其他值进行或运算将产生真。那就是 1 。
未评估语句的其余部分,因为||
和&&
是short-circuit operators,即,如果在您的语句i != 0
中,j
也不是k
将评估1
,因为结果保证为&&
。 f() || k()
的作用相似
重要的是要记住,如果你有k
之类的东西,其中|
有一些副作用,如输出到屏幕或变量赋值;它根本不会被执行。
按位 OR运算符ActiveRecord::RecordNotFound in TodosController#index
Couldn't find User with id=2
Rails.root: /home/randy/rubystack-1.9.3-29/projects/chap14
app/controllers/application_controller.rb:11:in current_user
app/views/todos/index.html.erb:21:in _app_views_todos_index_html_erb___949818655437808348_39324440
app/controllers/todos_controller.rb:8:in index
实际上是对值的按位表示进行OR运算;它评估所有操作数。
1 感谢@SouravGosh!
答案 1 :(得分:2)
在您的代码中,
w=i||j||k;
相当于
w= ((i||j) || k);
这意味着,首先评估(i||j)
,并根据结果(如果为0),评估后面的部分。
因此,在您的情况下,i
为4
,(i||j)
求值为1
,并且基于逻辑OR运算符语义,后面的部分不会被评估,并且整个表达式产生1
,最终分配给w
。
相关引用,来自C11
标准,章节§6.5.14,逻辑OR运算符
||
运算符如果其任一操作数比较不等于0,则应得1;否则,它 收益率0.结果的类型为int
。
然后,关于参数的评估,
[...]如果第一个操作数比较不等于0,则第二个操作数为 没有评估。
关于分组,
[...]
||
运算符保证从左到右的评估;
答案 2 :(得分:0)