Блог пользователя LM10xLeoMessi

Автор LM10xLeoMessi, история, 5 часов назад, По-английски

i was writing this code and faced this unknown behavior.

void solve(){
    string s = "a";
    for(int i = 0; i < s.size() - 1; i++){
        cout << "1st for loop\n";
        if(s[i] == s[i + 1]){
            cout << s[i] << s[i + 1] << '\n';
            return;
        }
    }
    for(int i = 0; i < s.size() - 2; i++){
        cout << "2nd for loop " << i << '\n';
        if(s[i] != s[i + 1] and s[i] != s[i + 2] and s[i + 1] != s[i + 2]){
            cout << s[i] << s[i + 1] << s[i + 2] << '\n';
            return; 
        }
    }
    cout << -1;
}

shouldn't it print -1? then why it enters into second for loop as the size of my string is 1? Can anyone help me to understand this behavior?

  • Проголосовать: нравится
  • 0
  • Проголосовать: не нравится

»
4 часа назад, # |
Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

string.size () returns unsigned integer. So the negative number you get from subtracting s.size() by 2 converts to a very large number.

  • »
    »
    3 часа назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    thanks a lot for making it clear :)

»
4 часа назад, # |
Rev. 5   Проголосовать: нравится 0 Проголосовать: не нравится

std::string::size() returns std::size_t, which is an unsigned type (usually unsigned long long).

If std::size_t is unsigned long long, then:

When s.size() == 0, (int)s.size() - 1 becomes 18446744073709551615, (int)s.size() - 2 becomes 18446744073709551614.

When s.size() == 1, (int)s.size() - 2 becomes 18446744073709551615.

Try:

change i < s.size() - 1 to i < (int)s.size() - 1

change i < s.size() - 2 to i < (int)s.size() - 2

Another better way is to define int n = (int)s.size() and replace every s.size() with n.

void solve(){
    string s = "a";
    n = (int)s.size();
    for(int i = 0; i < n - 1; i++){
        cout << "1st for loop\n";
        if(s[i] == s[i + 1]){
            cout << s[i] << s[i + 1] << '\n';
            return;
        }
    }
    for(int i = 0; i < n - 2; i++){
        cout << "2nd for loop " << i << '\n';
        if(s[i] != s[i + 1] and s[i] != s[i + 2] and s[i + 1] != s[i + 2]){
            cout << s[i] << s[i + 1] << s[i + 2] << '\n';
            return; 
        }
    }
    cout << -1;
}
»
3 часа назад, # |
Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

Try using int n = (int)s.size();