我们如何在赋值语句中解释`||`和`&&`?

时间:2015-11-18 16:16:08

标签: c

我很长一段时间都在编码,虽然我还是一名学生程序员/我通常擅长编程,但当问到下面的问题时,我会陷入困境。以下程序的输出和原因是什么?

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;的含义是什么?

3 个答案:

答案 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),评估后面的部分。

因此,在您的情况下,i4(i||j)求值为1,并且基于逻辑OR运算符语义,后面的部分不会被评估,并且整个表达式产生1,最终分配给w

相关引用,来自C11标准,章节§6.5.14,逻辑OR运算符

  

||运算符如果其任一操作数比较不等于0,则应得1;否则,它   收益率0.结果的类型为int

然后,关于参数的评估,

  

[...]如果第一个操作数比较不等于0,则第二个操作数为   没有评估。

关于分组

  

[...] ||运算符保证从左到右的评估;

答案 2 :(得分:0)

布尔运算符的结果产生int 01的值。

请参阅6.5.136.5.14第3段。

[...]运算符应得1 [或] 0.结果的类型为int。