在C编程中退出(1)循环

时间:2018-04-27 20:39:36

标签: c while-loop return-value infinite-loop

我正在为我的C编程课做例子。其中一个例子就是:

更新:return 0;break;

之间的差异
#include<stdio.h>
int main()
{

while(1)
{
  printf("Enter number: ");
  scanf("%d", &num);

  if (num==2)
   {
      return 0;
   }
  else
   {
      printf("Num = %d", num);
   }

return 0;
}

我知道while(1)是一个无限循环。 为了摆脱循环,我通常使用break;

但是,在这个例子中,当num=2失去循环时。

我不明白return o;如何影响while(1)循环?

4 个答案:

答案 0 :(得分:5)

return 0;

退出您所在的函数,返回值为0。因此,如果它离开函数,它显然会离开函数中的while循环。

答案 1 :(得分:5)

return会立即退出该功能 - 无论工作程序是在做什么。

如果您在while(1)函数中执行main循环,return将立即退出main函数,这意味着它将退出程序并退出无限循环同样。

如果你在其他函数中执行循环,比如fooreturn仍会立即退出foo函数,这仍然意味着它会退出无限循环。

答案 2 :(得分:3)

return终止函数并将控制权返回给调用函数(如果有的话)。 这就是它打破任何循环,条件或其他控制结构的原因。

在这方面,返回值并不重要。

答案 3 :(得分:2)

为了更好地向您解释,可以在代码中添加几行:

import SnapKit

lazy var loadingIndicator: UIActivityIndicatorView = {
    let loadingIndicator = UIActivityIndicatorView(activityIndicatorStyle: .gray)
    loadingIndicator.sizeToFit()

    loadingIndicator.autoresizingMask = [UIViewAutoresizing.flexibleHeight]
    loadingIndicator.hidesWhenStopped = true

    return loadingIndicator
}()

lazy var logoImageView: UIImageView = {
    let logoImageView = UIImageView()

    logoImageView.contentMode = UIViewContentMode.scaleAspectFit
    logoImageView.backgroundColor = UIColor.white

    logoImageView.clipsToBounds = true

    return logoImageView
}()

lazy var storeLabel: UILabel = {
    let storeLabel = UILabel()
    storeLabel.sizeToFit()

    storeLabel.font = UIFont.preferredFont(forTextStyle: .footnote)
    storeLabel.adjustsFontForContentSizeCategory = true
    storeLabel.textColor = UIColor.lightGray

    return storeLabel
}()

lazy var priceLabel: UILabel = {
    let priceLabel = UILabel()
    priceLabel.sizeToFit()

    priceLabel.font = UIFont.preferredFont(forTextStyle: .title1)
    priceLabel.adjustsFontForContentSizeCategory = true
    priceLabel.textColor = UIColor.black

    return priceLabel
}()

lazy private var stackView: UIStackView = {
    let stackView = UIStackView()
    stackView.sizeToFit()

    stackView.axis = UILayoutConstraintAxis.vertical
    stackView.alignment = UIStackViewAlignment.leading
    stackView.distribution = UIStackViewDistribution.fill
    stackView.spacing = 0

    return stackView
}()

lazy private var priceStackView: UIStackView = {
    let priceStackView = UIStackView()
    priceStackView.sizeToFit()

    priceStackView.axis = UILayoutConstraintAxis.horizontal
    priceStackView.alignment = UIStackViewAlignment.center
    priceStackView.distribution = UIStackViewDistribution.fill
    priceStackView.spacing = 0

    return priceStackView
}()

override func draw(_ rect: CGRect) {
    super.draw(rect)

    let margins = contentView.layoutMarginsGuide

    contentView.addSubview(logoImageView)
    contentView.addSubview(stackView)

    stackView.addArrangedSubview(storeLabel)
    stackView.addArrangedSubview(priceStackView)

    priceStackView.addArrangedSubview(loadingIndicator)
    priceStackView.addArrangedSubview(priceLabel)

    logoImageView.snp.makeConstraints { (make) in
        make.left.equalTo(layoutMarginsGuide).offset(layoutMargins.left * 0.5)
        make.centerY.height.equalTo(layoutMarginsGuide)
        make.width.equalTo(logoImageView.snp.height)
    }

    stackView.snp.makeConstraints { (make) in
        make.left.equalTo(logoImageView.snp.right).offset(layoutMargins.left * 1.5)
        make.right.centerY.equalTo(margins)
        make.height.equalTo(margins).offset(-15)
    }
}

并允许#include<stdio.h> int main() { while(1) { printf("Enter number: "); scanf("%d", &num); if (num==2) { return 0; } else { printf("Num = %d", num); } } printf ("BYE\n"); return 0; } 代替break

return 0;

第一个代码的输出不包括消息“BYE”,其中第二个代码。

因此总结#include<stdio.h> int main() { while(1) { printf("Enter number: "); scanf("%d", &num); if (num==2) { break; } else { printf("Num = %d", num); } } printf ("BYE\n"); return 0; } 终止函数并且不执行任何低于它的函数,其中break终止循环并且程序不会在循环中执行剩余的行。