繁体   English   中英

在C程序中while(i = 20)或任何数字的结果是什么?

[英]What is the result of while(i=20) or any number in general in a C program?

在某个地方遇到了这个问题-

以下程序的输出是什么

int main(void) {
    int  i = 10 ; 
    while ( i = 20 )  
    printf ( "\nA computer buff!" ) ;
    return 0;
}

现在我知道在C语言中每个非零数字都被视为true,但是我还无法弄清楚while内使用赋值运算符的结果。 当我运行代码“计算机迷”时,循环中打印的次数未知。 我知道这是一个愚蠢的问题,但仍然存在疑问。

那应该是一个无限循环,因为赋值表达式的结果是i = 20将产生20。

来自文档

赋值操作将右操作数的值分配给左操作数命名的存储位置。 因此,赋值操作的左侧操作数必须是可修改的l值。 赋值后,赋值表达式具有左操作数的值,但不是l值。

在你的代码中

 while ( i = 20 )

本质上是为i分配20,然后将i作为while循环的条件检查。 由于循环体内没有break条件,因此实际上是无限循环。

您可以使用gcc中的-S选项在* nix上轻松检查它。 我拿了这个文件:

#include <stdio.h>

main( ){  
   int  i = 10 ; 
   while ( i == 20 )  
   printf ( "\nA computer buff!" );
}

gcc -S test.c ,它给了我聪明的信息:

    .file   "c.c"
    .section    .rodata
.LC0:
    .string "\nA computer buff!"
    .text
    .globl  main
    .type   main, @function
main:
.LFB0:
    .cfi_startproc
    pushq   %rbp
    .cfi_def_cfa_offset 16
    .cfi_offset 6, -16
    movq    %rsp, %rbp
    .cfi_def_cfa_register 6
    subq    $16, %rsp
    movl    $10, -4(%rbp)
    nop
.L2:
    movl    $20, -4(%rbp)
    movl    $.LC0, %edi
    movl    $0, %eax
    call    printf
    jmp .L2
    .cfi_endproc
.LFE0:
    .size   main, .-main
    .ident  "GCC: (Ubuntu 4.8.4-2ubuntu1~14.04) 4.8.4"
    .section    .note.GNU-stack,"",@progbits

您可以在jmp .L2看到这是唯一负责循环的分支,这是非决定性的。 movl $20, -4(%rbp)是i的赋值20。

while(1)是无限循环,因此其执行次数。 如果要在第一次迭代后从循环中移出,请在循环中使用break语句。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM