Denken Sie daran, dass, obwohl Iostreams <<
(und >>
) I/O überlasten, diese ursprünglich als Bit-Shift-Operatoren definiert wurden.Wenn der Compiler den Ausdruck analysiert, sieht er im Grunde "Operand, Operator, Operand" und prüft dann, ob die Operanden von Typen sind, auf die dieser Operator angewendet werden kann.
In diesem Fall haben wir ein String-Literal und (scheinbar) irgendeine Art von Integer, und der Compiler weiß, wie man diese Berechnungen durchführt (nach der Umwandlung des String-Literals in einen Zeiger).
Aus Sicht der Compiler, jedoch ist dies nicht viel anders als so etwas wie:
int a, b=1, c=2, d = 3;
a = b << c + d;
Der Unterschied besteht darin, dass mit Operanden vom Typ int
, die Bedeutung ziemlich offensichtlich ist: es tut hinaus und Bit-Verschiebung. Bei Iostreams ändert sich die Bedeutung, die an <<
und >>
angefügt ist, aber die für sie in einem Ausdruck zulässige Syntax ist unverändert.
aus der „Sicht“ des Compilers ist die einzige Frage, ob die Operanden zu +
von Typen sind für die +
erlaubt ist - in diesem Fall Sie pointer to char + integer
haben, so dass erlaubt ist. Das Ergebnis ist ein Zeiger auf char, und es hat eine Überladung von <<
, die einen linken Operanden vom Typ ostream und einen rechten Operator vom Typ pointer to char
nimmt, so dass der Ausdruck als Ganzes in Ordnung ist (so weit es ihn interessiert) .
Der 'cout' ist hier irrelevant. Was sind die Arten von 'numSamples' und' maxSampleValue'? 'Int's? – BoBTFish
Versuchen Sie eine längere Zeichenfolge und verwenden Sie 0, 1, 2 usw. anstelle Ihrer Variablen. – molbdnilo
Dass Sie nach 'cout' fragen, deutet auf ein Missverständnis der Sprache hin. "Cout" ist kein Schlüsselwort, und es ist nicht magisch. Es ist ein gewöhnliches Objekt. 'cout' wird mit dem * Ergebnis * von' "num" + numSamples' gespeist; es hat eine Art zu wissen, dass der ursprüngliche Ausdruck ein "+" darin enthielt. – jamesdlin