为什么我的“while”循环没有结束?是由于运算符优先级还是其他原因?

问题描述

为什么我的 while 循环没有结束?它给出了正确的结果,但它在无限循环中运行。是因为运算符优先级吗?

void equate()
{
    int i = 0,n = 0;
    while (((a[i] != '\0') && (b[i] != '\0')) || (n != 1))
    {
        if (a[i] > b[i])
        {
            std::cout << "\n" << a << " string is greater";
            n = 1;
        }
        else if (a[i] < b[i])
        {
            std::cout << "\n" << b << " string is greater";
            n = 1;
        }
        else
            i++;
    }
    if (n == 0)
    {
        std::cout << "\n" << "Both strings " << a << " and " << b << " are equal";

    }

解决方法

在这些 if 语句中

   if (a[i] > b[i])
   {
       std::cout << "\n" << a << " string is greater";
       n = 1;
   }
   else if (a[i] < b[i])
   {
       std::cout << "\n" << b << " string is greater";
       n = 1;
   }

索引 i 没有增加。所以while循环条件中的第一个子表达式

((a[i] != '\0') && (b[i] != '\0'))
如果控制权被传递给这些 if 语句,

is 总是评估为真。因此,您将陷入无限循环。

至少像这样重写条件

while ( a[i] != '\0' && b[i] != '\0' && n != 1 )

尽管在比较字符串的长度彼此不相等的情况下,循环(两个字符串的比较)的结果可能不正确。

也就是说,仅像您在此语句中所做的那样检查 n 是否等于 0 是不够的。

   if (n == 0)
   {
       std::cout << "\n" << "Both strings " << a << " and " << b << " are equal"; 
   }