我的if语句逻辑有什么问题?

b1G*_*GZZ 1 c++ logic if-statement

在这个小程序中,我尝试按降序排序3个数字.但看起来像"// 3 2 1 - 不起作用"的行作为评论没有按预期工作.看来我的逻辑是正确的.

我的意见: 4,554和454545

输出:(这不是我想要的)554,454545和4

如果整数numbThree的值保持大于numbOne并且如果numbOne 大于numbTwo(NOT == else),它应该按此顺序输出numbThree,numbTwo和numbOne,为什么它不起作用?

#include <iostream>

int main() {
int numbOne = 0, numbTwo = 0, numbThree = 0;
std::cin >> numbOne >> numbTwo >> numbThree;

if (numbOne > numbTwo) {
    if (numbTwo > numbThree) {
        std::cout << numbOne << " " << numbTwo << " " << numbThree << std::endl; // 1 2 3
    }
    else {
        std::cout << numbOne << " " << numbThree << " " << numbTwo<< std::endl; // 1 3 2
    }
}
else if (numbTwo > numbOne) {
    if (numbOne > numbThree) {
        std::cout << numbTwo << " " << numbOne << " " << numbThree << std::endl; // 2 1 3 - works
    }
    else {
        std::cout << numbTwo << " " << numbThree << " " << numbOne << std::endl; // 2 3 1
    }
}
else if (numbThree > numbOne) {
    if (numbOne > numbTwo) {
        std::cout << numbThree << " " << numbOne << " " << numbTwo << std::endl; // 3 1 2
    }
    else {
        std::cout << numbThree << " " << numbTwo << " " << numbOne << std::endl; // 3 2 1 - doesn't work
    }
}

std::cin.get();
std::cin.ignore();
return 0;
}
Run Code Online (Sandbox Code Playgroud)

在此先感谢帮助我.

Wal*_*ter 8

一般来说,你不能用2次比较对3个数字进行排序(从信息内容的角度来看,YSC的评论很难理解).你的案子1 3 2已经存在缺陷:怎么numbThree > numbOne办?

通常,您必须允许最多3次比较.当然,您可以简单地使用标准库提供的排序功能(即通过语言).如果你不想(出于某种原因),那么正确的逻辑(升序)就是

if(a<b)
  if     (b<c) // a,b,c   // 2 comparisons
  else if(a<c) // a,c,b   // 3 comparisons
  else         // c,a,b   // 3 comparisons
else
  if(    (a<c) // b,a,c   // 2 comparisons
  else if(b<c) // b,c,a   // 3 comparisons
  else         // c,b,a   // 3 comparisons
Run Code Online (Sandbox Code Playgroud)

因此,在6种可能情况中的4种中,我们需要3次而不是2次比较.

  • 通过两次比较,可以获得2位信息.找到3个数字的排列有6个可能的输出,即~2.58比特> 2比特. (4认同)