This allows access if the user is either the owner or an admin. If the user is owner, it skips checking admin.
Blockchain / Solidity
if (isOwner || isAdmin) {
// allow access
}
This avoids errors by checking if user exists before checking if active.
Blockchain / Solidity
if (user != null && user.isActive) {
// safe to use user
}
Sample Program
This smart contract checks if a user can spend money only if they have enough balance and are verified. The second check is skipped if balance is low.
Blockchain / Solidity
pragma solidity ^0.8.0;
contract ShortCircuitExample {
uint public balance = 100;
bool public isVerified = false;
function canSpend(uint amount) public view returns (bool) {
// Check if balance is enough and user is verified
if (balance >= amount && isVerified) {
return true;
} else {
return false;
}
}
function test() public view returns (string memory) {
if (canSpend(50)) {
return"Allowed to spend 50";
} else {
return"Not allowed to spend 50";
}
}
}
OutputSuccess
Important Notes
Short-circuiting helps avoid errors like checking properties of a null object.
It can make your code faster by skipping unnecessary checks.
Summary
Short-circuiting stops checking conditions as soon as the result is known.
Use && to require all conditions true, and || to require any condition true.
This helps avoid errors and improve performance in your blockchain code.
Practice
(1/5)
1. What does short-circuiting mean in blockchain condition checks using && and ||?
easy
A. It stops checking further conditions once the result is decided.
B. It always checks all conditions regardless of the first result.
C. It reverses the order of condition checks.
D. It only works with numeric conditions.
Solution
Step 1: Understand short-circuiting concept
Short-circuiting means the program stops checking conditions as soon as the final result is known.
Step 2: Apply to && and ||
For &&, if the first condition is false, no need to check further. For ||, if the first condition is true, no need to check further.
Final Answer:
It stops checking further conditions once the result is decided. -> Option A
Quick Check:
Short-circuiting = Stops early [OK]
Hint: Stop checking when outcome is certain [OK]
Common Mistakes:
Thinking all conditions always run
Confusing && and || behavior
Assuming short-circuiting only applies to numbers
2. Which of the following is the correct syntax for short-circuit AND in a blockchain smart contract condition?
easy
A. if (condition1 | condition2) { execute(); }
B. if (condition1 & condition2) { execute(); }
C. if (condition1 || condition2) { execute(); }
D. if (condition1 && condition2) { execute(); }
Solution
Step 1: Identify correct AND operator syntax
The short-circuit AND operator is &&, which checks the second condition only if the first is true.
Step 2: Compare options
if (condition1 && condition2) { execute(); } uses &&, correct for short-circuit AND. Options B and D use single & or | which are bitwise operators, not short-circuit. if (condition1 || condition2) { execute(); } uses OR operator.
Final Answer:
if (condition1 && condition2) { execute(); } -> Option D
Quick Check:
Short-circuit AND = && [OK]
Hint: Use double ampersand for AND short-circuit [OK]
Common Mistakes:
Using single & instead of &&
Confusing AND (&&) with OR (||)
Using bitwise operators by mistake
3. Consider this blockchain code snippet:
bool a = false; bool b = true; if (a && (b = false)) { } return b;
What is the returned value?
medium
A. false
B. Syntax error
C. true
D. Runtime error
Solution
Step 1: Analyze short-circuit AND behavior
Since a is false, the b = false part is not executed due to short-circuiting.
Step 2: Determine final value of b
b remains true because the assignment did not happen. So, return b; returns true.
Final Answer:
true -> Option C
Quick Check:
False && skips second = b stays true [OK]
Hint: False && skips right side, no assignment [OK]
Common Mistakes:
Assuming b becomes false anyway
Ignoring short-circuit effect
Thinking code throws error
4. Find the error in this blockchain condition:
if (isValid || checkStatus()) { execute(); }
where checkStatus() is a function that must run always.
medium
A. Function checkStatus() may not run due to short-circuiting.
B. No error, code is correct.
C. Syntax error: missing semicolon.
D. Logical AND should be used instead of OR.
Solution
Step 1: Understand short-circuit OR behavior
If isValid is true, checkStatus() will not run because of short-circuiting.
Step 2: Identify problem with function call
Since checkStatus() must always run, using || causes it to sometimes skip, which is an error.
Final Answer:
Function checkStatus() may not run due to short-circuiting. -> Option A
Quick Check:
OR short-circuit skips right if left true [OK]
Hint: OR skips right if left true, function may not run [OK]
Common Mistakes:
Assuming function always runs
Confusing syntax error with logic error
Using AND instead of OR without reason
5. You want to check two blockchain conditions: isOwner and hasBalance. You must run logAccess() always, but only execute transfer() if both conditions are true. Which code correctly uses short-circuiting?
hard
A. if (isOwner && hasBalance) { logAccess(); transfer(); }
B. logAccess(); if (isOwner && hasBalance) { transfer(); }
C. if (isOwner & hasBalance) { logAccess(); transfer(); }
D. if (isOwner && hasBalance && logAccess()) { transfer(); }
Solution
Step 1: Identify when logAccess() must run
logAccess() must run always, so it should be called outside the condition.
Step 2: Check condition for transfer()
transfer() runs only if both isOwner and hasBalance are true, so use && inside the if.
Step 3: Analyze options
if (isOwner && hasBalance) { logAccess(); transfer(); } puts logAccess() inside the if, so it only runs if conditions true. if (isOwner && hasBalance && logAccess()) { transfer(); } calls logAccess() inside condition, so it may not run due to short-circuiting. if (isOwner & hasBalance) { logAccess(); transfer(); } uses single & which is bitwise, not short-circuit. logAccess(); if (isOwner && hasBalance) { transfer(); } calls logAccess() first always, then conditionally transfer().
Final Answer:
logAccess(); if (isOwner && hasBalance) { transfer(); } -> Option B