如何((x)||(y = z))'工作?

时间:2017-03-08 19:16:39

标签: c

我不太清楚这种情况下的if语句是如何工作的。它会评估x != 0语句,当它不再为真时,它会将z分配给y,然后将break分配给if语句?

int main()
{
    int x, y, z, i;
    x = 3;
    y = 2;
    z = 3;

    for (i = 0; i < 10; i++) {
        if ((x) || (y = z)) {
            x--;
            z--;
        } else {
            break;
        }
    }

    printf("%d %d %d", x, y, z);
}

6 个答案:

答案 0 :(得分:30)

让我们把它分解成更小的位。

  1. if (x)if (x != 0)相同。如果x != 0,则您知道条件为true,因此您不必执行if的其他部分。

  2. 如果第1部分为false,则y = z会将z分配到y并返回y的最终值。

  3. 从第2点开始,我们可以理解if (y = z)相当于y = z; if (y != 0)

  4. 因此,从第1点和第3点开始,我们可以理解:

    if ((x) || (y = z)) {
        doSomething();
    }
    else {
        doSomethingElse();
    }
    

    与:

    相同
    if (x != 0) {
        doSomething();
    }
    else {
        y = z;
        if (y != 0) {
            doSomething();
        }
        else {
            doSomethingElse();
        }
    }
    

    但它确实不是特别易读的代码。

答案 1 :(得分:18)

没有。 if ((x) || (y = z)) { 在C-English中基本上是:

  • 如果x非零,请评估以下代码。
  • 如果x为零,请将y设置为z
  • 如果y非零,请评估以下代码。
  • 否则,打破循环。

如果x为零或y为零,则会突破循环。

答案 2 :(得分:7)

int main()
{
    int x = 3;
    int y = 2;
    int z = 3;
    unsigned int i;

    for (i = 0; i < 10; i++)
        if (x != 0) {
            x = x-1;
            z = z-1;
        } 
        else {
            y = z;

            if (y != 0) {
                x = x-1;
                z = z-1;
            }
            else {
                break;
            }
        }
    }
    printf("%d %d %d", x, y, z);
}

答案 3 :(得分:3)

在C中,有short-circuiting,因此在y=z变为零之前,不会评估语句x

x == 0时,z也会以同样的方式递减,z == 0。因此,由于分配,y当时也将为零。声明y=z此时还会返回y,这将作为条件进行评估,由于这也是0else break将会被点击。

因此我认为答案应该是0 0 0

答案 4 :(得分:1)

在if语句中使用赋值时,将返回赋值的结果。所以当你写:

if (x = y)

除非y的值为0,否则它将始终为true,因此作为分配的结果返回0并且不执行if语句。(除{{之外的任何内容1}}被认为是真的。)

所以当你写:

0

仅当if ( x || (x = y)) x&amp;时,if语句才会执行0y

答案 5 :(得分:0)

这里

 $(notesSelector).on('froalaEditor.initialized', function (e, editor) {
    //set original html after loading
    froalaInitialHtml = $(notesSelector).froalaEditor('html.get');
});

$(notesSelector).froalaEditor({
  key: 'XXXXXXXXXX',
  toolbarButtons: ['bold', 'italic', 'underline', 'strikeThrough', 'subscript', 'superscript', 'fontFamily', 'fontSize', '|', 'color', 'emoticons', 'inlineStyle', 'paragraphStyle', '|', 'paragraphFormat', 'align', 'formatOL', 'formatUL', 'outdent', 'indent', 'quote', 'insertHR', '-', 'insertLink', 'insertImage', 'insertVideo', 'insertFile', 'insertTable', 'undo', 'redo', 'clearFormatting', 'selectAll', 'html'],

  toolbarButtonsXS: ['undo', 'redo' , '-', 'bold', 'italic', 'underline','insertImage'],
  imageEditButtons:['imageInfo', 'imageAlign' ],
  toolbarSticky: true, });` 

有两个条件 一个条件是 if ((x) || (y = z)) 而另一个条件是if ((x)) 如果其中一个是真的那么如果部分是执行,否则条件工作

  • 仅当且两个条件都为假时才执行。