Path: csiph.com!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail From: Keith Thompson Newsgroups: comp.lang.c++ Subject: Re: is "x *= ++f * ++f" a valid statement ? Date: Sun, 11 Aug 2024 14:09:41 -0700 Organization: None to speak of Lines: 104 Message-ID: <871q2ug416.fsf@nosuchdomain.example.com> References: <96127c8d8d204b7c3230828101bc2b6e@www.novabbs.org> <877cdchj2i.fsf@nosuchdomain.example.com> <86ttgg41yb.fsf@linuxsc.com> <8734nzhjkg.fsf@nosuchdomain.example.com> <87y15rg3wo.fsf@nosuchdomain.example.com> <8634nbp52l.fsf@linuxsc.com> MIME-Version: 1.0 Content-Type: text/plain Injection-Date: Sun, 11 Aug 2024 23:09:42 +0200 (CEST) Injection-Info: dont-email.me; posting-host="4e0a7955da0737aad349c16a734eea4d"; logging-data="3019149"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX19b4a0PDdktFvZpGO3Opd4M" User-Agent: Gnus/5.13 (Gnus v5.13) Cancel-Lock: sha1:Hm4rj1isBht7ajKSIKE1o0YCBmQ= sha1:7oz6nP3dn+JP0qTFkjYOhie4MzU= Xref: csiph.com comp.lang.c++:119801 Tim Rentsch writes: > Keith Thompson writes: >> Keith Thompson writes: >>> Tim Rentsch writes: >>>> Keith Thompson writes: >>>>> James Kuyper writes: >>>> [...] >>>> >>>>>> A minor detail is that a variable must be declared, whereas memory >>>>>> locations can, for instance, be part of allocated memory for which >>>>>> no declaration exists - it is still undefined behavior to write >>>>>> code that applies unsequence side-effects to such memory locations. >>>>> >>>>> Digression: I'm not even sure what "variable" means in C++. The >>>>> standard defines the term, but not in a way that really tells us >>>>> what it means. >>>>> >>>>> "A *variable* is introduced by the declaration of a reference other >>>>> than a non-static data member or of an object. The variable's name, >>>>> if any, denotes the reference or object." >>>> >>>> What part do you find confusing or hard to understand? >>> >>> The missing part that should tell us what a variable *is*. >>> >>> It says that certain declarations "introduce" a variable. That's a >>> statement about variables, but it doesn't say what a variable is. >>> >>> Given: >>> >>> int n; >>> >>> we know that the declaration introduces a variable. Is the object >>> itself a "variable"? That's the obvious meaning, and it's consistent >>> with what the standard says. Or is a "variable" some kind of logical >>> binding between an object and a name? That's also consistent with what >>> the standard says. Under the latter interpretation, the "variable" has >>> a name, and that name denotes an object, but the variable is not the >>> object. >>> >>> Given the above declaration, is the introduced variable an object? If >>> so, or if not, how does your answer follow from what the standard says? > > [...] > >> But the following paragraph says: >> >> A *local entity* is a variable with automatic storage duration >> (6.7.5.4), a structured binding (9.6) whose corresponding variable >> is such an entity, or the *this object (7.5.3). >> >> Storage duration is an attribute of objects. If a variable can have >> automatic storage duration, then apparently a variable is an object. > > It seems clear that the quoted sentence is meant to be read as > > A *local entity* is a variable [associated with an object that > has] automatic storage duration, [etc]. It seems clear to you. It's not clear to me. If the only way to understand a passage is to assume it includes extra words, it is at best poorly written -- and I can't be sure that any assumptions about what it *really* means are correct. > I'm not sure if C++ references also have storage durations, in which > case the word "object" in that sentence might need to be replaced with > "object or reference". The key point though is that the property of > having automatic storage duration is meant to be associated with the > affiliated object or reference rather than with the variable itself. Perhaps so, but that still doesn't tell me what a "variable" is. Apparently a "variable" is something *associated with* an object. But what is it, and how is the concept useful when we already have the concept of an "object"? I tried following your advice and searchin for uses of "variable" in the C++ standard (which, as James Kuyper pointed out, should not be necessary to understand the definition). It was not helpful. For example, "Variables with static storage duration are initialized as a consequence of program initiation.". So a variable is a thing that can have a storage duration and be initialized? And it's not an object? I get the impression (quite possibly mistaken) that the authors of the standard implicitly assume in some places that a variable is an object, and in other places that it's something else. The most obvious meaning is that a "variable" is an object that has a name introduced by a declaration. (I'll gloss over the question of whether something that's const-qualified is a "variable", but I'm willing to accept that "variable" doesn't have to mean that something can vary.) But that's not what the standard says. I'll note that the C standard does not define or use the term "variable" (though it does use the word in its non-tecnical sense). Instead it refers to "objects". Perhaps C++ could have done the same. If I were to ask you "What is a variable in C++?", could you give a clear answer? What would that answer be? Is a variable an object or is it not? -- Keith Thompson (The_Other_Keith) Keith.S.Thompson+u@gmail.com void Void(void) { Void(); } /* The recursive call of the void */