Fabbiucciello
Fabbiucciello

Reputation: 1554

How does cout << " \n"[i == n - 1]; work?

I didn't get how [i == n-1] works in this scenario

for (int i = 0; i < n; i++) {
    cout << a[i] << " \n"[i == n - 1];
}

Upvotes: 4

Views: 1581

Answers (2)

abelenky
abelenky

Reputation: 64692

Expression i == n-1 is a boolean expression that will evaluate to either 1 (True) or 0 (False).

" \n" is an array of 3 character values:

  • Space (0x32)
  • \n (0x0D)
  • NULL (0x00)

So the full expression will either evaluate to the Space or the \n, depending on if i is the last index of array a.

The complete for-loop with cout will print spaces up until i is at the end of the array, and then will finally print a \n after the last element.

It is clever, but confusing. I would tell a programmer to find a better way.

I might prefer using a ternary operator (? :)

for (int i = 0; i < n; i++) {
        cout << a[i] << (i == n - 1) ? "\n" : " ";
  }

Upvotes: 4

463035818_is_not_an_ai
463035818_is_not_an_ai

Reputation: 122585

The string literal " \n" is of type const char[3] (one for the 0-terminator) and you can access elements of that array as usual:

assert(" \n"[0] == ' ');
assert(" \n"[1] == '\n');

The "index" i == n-1 is true for all but the last iterations, which converts to 1 (while false becomes 0). So the same could have been written more readable:

for (int i = 0; i < n; i++) {
    if ( i == n-1) {
        cout << a[i] << '\n';
    } else {
        cout << a[i] << ' ';
    } 
}

Upvotes: 0

Related Questions