Deutsch   English   Français   Italiano  
<v3uv51$22afr$2@dont-email.me>

View for Bookmarking (what is this?)
Look up another Usenet article

Path: ...!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail
From: bart <bc@freeuk.com>
Newsgroups: comp.lang.c
Subject: Re: Shortcut Booleans
Date: Fri, 7 Jun 2024 13:41:06 +0100
Organization: A noiseless patient Spider
Lines: 51
Message-ID: <v3uv51$22afr$2@dont-email.me>
References: <v3uoq3$21g4g$7@dont-email.me>
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 8bit
Injection-Date: Fri, 07 Jun 2024 14:41:05 +0200 (CEST)
Injection-Info: dont-email.me; posting-host="29f6a6cdd40af68cde491d55d42bbb4c";
	logging-data="2173435"; mail-complaints-to="abuse@eternal-september.org";	posting-account="U2FsdGVkX1+6Z3Duk0sXamP/ud2x/hzE"
User-Agent: Mozilla Thunderbird
Cancel-Lock: sha1:cIbE79W2rAYKJJR01rVIhdl/2nM=
In-Reply-To: <v3uoq3$21g4g$7@dont-email.me>
Content-Language: en-GB
Bytes: 2534

On 07/06/2024 11:52, Lawrence D'Oliveiro wrote:
> I wonder why, traditionally, shortcut evaluation of boolean subexpressions
> has been applied to “and” and “or” connectives, but not any others.

Common sense applies, otherwise you could shortcut these operations:

     a * b           // when a is zero, the result is zero
     a & b           // when a is zero

Here you would probably spend more time checking the value of 'a' then 
branching, than just doing the operation.

The language chooses to specify that both operands are always evaluated. 
That is the most useful behaviour.

Short-circuiting logical ops are mainly associated with conditional 
expressions used for branching, such as in 'if', 'while', 'for' statements.

If both operands always had to be evaluated, then code would be 
inefficient as it would need to create an actual result:

     if (f() && g())

Not only would both functions be called, but you'd need to combine the 
results which means remembering the value of f().


(I have played with a logical and/or operators that didn't have 
short-circuit semantics; they worked like this:

    if f() andb g()

('andb' means 'and-both'.) But I already had too many such features and 
eventually it was dropped.

My 'andb' example be trivially expressed in other ways, such as in this C:

    if (!!f() & !!g())

)

> 
> For example, what about “implies”?
> 
>      a implies b

What about it? I've never used that, ever. I doubt many have.

If it can be rewritten 'not a or b' then just use that.