Statement with ? in C [duplicate] - c

This question already has answers here:
Closed 12 years ago.
Possible Duplicate:
How do I use the conditional operator?
I’m new to C language, and in one of the sample codes I was reviewing I faced the statement:
A = A ? B: C[0]
I was just wondering what the task of the previous statement is and what will be the result after execution of the mentioned statement.

It's called a ternary operator. expr ? a : b returns a if expr is true, b if false. expr can be a boolean expression (e.g. x > 3), a boolean literal/variable or anything castable to a boolean (e.g. an int).
int ret = expr ? a : b is equivalent to the following:
int ret;
if (expr) ret = a;
else ret = b;
The nice thing about the ternary operator is that it's an expression, whereas the above are statements, and you can nest expressions but not statements. So you can do things like ret = (expr ? a : b) > 0;
As an extra tidbit, Python >=2.6 has a slightly different syntax for an equivalent operation: a if expr else b.

It assigns to A the value of B if A is true, otherwise C[0].
?:

result = a > b ? x : y; is identical to this block:
if (a > b) {
result = x;
}
else
{
result = y;
}

It's the same as an if else statement.
It could be rewritten as:
if ( A != 0 )
{
A = B;
}
else
{
A = C[ 0 ];
}

A gets assigned to B if A exists (not NULL), otherwise C[0].

if A equal 0 then A = C[0] else A = B

Related

What does the ! operator do in this situation? [duplicate]

This question already has answers here:
Using Exclamation Marks '!' in C
(5 answers)
Closed 2 years ago.
I am learning C from a textbook, and I stumbled onto the code of a function, where the following part had little explanation to what it does. It looked something like this:
int func(char *a, char *b) {
if(!a || !b)
return 0;
return 1;
}
My understanding is it checks that a and b are not null? Is this correct? Any help is welcome for this beginner :)
! is the logical not operator.
The if condition !a || !b is true if either a or b are zero, i.e. NULL pointers. Then the func returns 0 in that case, 1 otherwise:
a b condition func
null null true 0
null non-null true 0
non-null null true 0
non-null non-null false 1
It is easier to understand if you negate the condition and swap the return values:
int func(char *a, char *b) {
if(a && b)
return 1;
return 0;
}
Since in C the relational operators give their result as an int, i.e. 0 for false and 1 for true, you can simplify further to:
int func(char *a, char *b) {
return a && b;
}
Not exactly. When a is null or b is null then the logical NOT operator will cause the if conditional to evaluate as true and the return value is zero, otherwise the code returns 1 indicating that either a or b is not null.
The ! operator in most programming languages reverses the logic(or the not operator). i.e.(From True to False or vice versa)
For example:
a=True;
if(!a) {
return 1;
}else {
return 2;
}
Output is 2. So in this case, you are saying if not A OR not B, return 0.

How is 0 used in conditional operator in C?

Conditional operator in C is used like this:
condition ? value_if_true : value_if_false
What does 0 mean when it's used in the value_if_false?
I've seen some people using it like this, for example.
a == b ? i++ : 0
It seems like it does nothing. Does this work like return 0 in other functions?
In C language, ternary is shorter version of if statement and it requires both statements, if_true and if_false. It would be like this (in fact it can have multiple statements for one case, separated with comma):
Short:
condition ? if_true : if_false;
Long:
if (condition) {
if_true;
} else {
if_false;
}
You can also assign the value if you put something infront of condition.
Short:
result = condition ? if_true : if_false;
Long:
if (condition) {
result = if_true;
} else {
result = if_false;
}
Now here is the trick. In C language, writing 0; is a valid statement, so your ternary becomes in longer version same as code below:
if (a == b) {
i++;
} else {
0; /* This is valid C statement */
}
Or if you have assignment too, it would be:
if (a == b) {
result = i++;
} else {
result = 0;
}
You can also do this:
int a;
/* Code here ... */
condition ? a = 5: 0;
That is effectively the same as:
if (condition) {
a = 5;
} else {
/* DO not touch a */
}
The ?: operator is a ternary operator, but it is not called "ternary" as some answers and/or comments here suggest. It just is the arity of the operator, just as + is a binary operator or as & is unary. If it has a name at all, it is called "Conditional Expression"-operator
It is not quite equivalent to if/else, because it is a conditional value (with the consequence, that both expressions must have the same type) in the first place, not a conditional execution. Of course, both types can be cast to make them equal.
In the case of what the OP does, a better option (if if shall not be used) is in my opinion:
a == b && i++;
which resembles a bit more logical what happens. But of course it is a matter of style.
The reason why someone might want to write a == b ? i++ : 0; is that s/he probably wants to have an (Caution! You are now entering an opinion-based area) easier and faster alternative to if (a == b) i++; - although this is of course opinion-based and I personally not share the same opinion.
One thing I can think of as a "blocker" at the if statement is the requirement to write the parentheses () which can be omitted by using the conditional operator instead.
"But why the 0?"
The C syntax requires a third operand for the conditional operator. Else if you would want to compile for example:
a == b ? i++;
you will get an error from the compiler:
"error: expected ':' before ';' token"
Or respectively, doing so:
a == b ? i++ : ;
would raise:
"error: expected expression before ';' token"
So they use 0 as kind of "syntax satisfier" to be able to use the conditional operator as replacement for the if statement. You could use any other numeral value here as well, but 0 is the most readable value, which signifies that it has no use otherwise.
To showcase the use at an example:
#include <stdio.h>
int main (void)
{
int a, b, c = 4;
a = 2;
b = 2;
a == b ? c++ : 0;
printf("%d",c);
return 0;
}
The output for c will be 5, because a == b.
Note that a == b ? i++ : 0 is different when used f.e. inside of an assignment like f.e.:
int c = a == b ? i++ : 0;
Here c is either getting assigned by i or 0, dependent upon a == b is true or not. If a == b is true, c is assigned by i. If a == b is wrong, c is assigned by 0.
Side Notes:
To view it from a technical point, ?= is called the "conditional operator". The conditional operator is one of the group of ternary operators.
If you want to learn more about the conditional operator ?=, look at ISO:IEC 9899:2018 (C18), §6.5.15 - "Conditional operator" for more information.
There's nothing special about 0 one could write
a == b ? i++ : 1
And it would behave the same way.
Only difference is when you assign the expression to say another variable:
int c = a == b ? i++ : 1;
// a == b -> c will be i++
// a != b -> c will be 1
However it's much cleaner to write
if (a == b) i++;
It helps to think of the ternary operator as a shorthand way or writing an if-else statement.
If(a == b){
i++;
}else{
//if assigned, return 0. Else do nothing.
}

how will this statement execute conditional operation in c?

i have conditional operator's statement and i have no idea how its works.
there are two questions:
Question 1 : what will the following statement do :
quotient=(b==0)?0:(a/b) \\ here a,b,quotient is integer
Question 2 : Can preceding statement be written as follow ?
quotient=(b)?(a/b):0;
NOW MY QUESTION IS :
Question:1 :: we do not know b's value then how can we check this condition(b==0)
Question 2:: what (b) indicate ?
The conditional check in the C ternary conditional operator is an implicit comparison to not-zero.
In other words
quotient = b ? a / b: 0;
is the same as
quotient = b != 0 ? a / b : 0;
or the absurd
quotient = (b != 0) != 0 ? a / b : 0;
This is consistent throughout C, e.g. in an if, a for stopping condition, a while, &&, ||, &c.
If you try
int b = 0;
if (b) {
printf("Hello World");
}
Does not print anything while :
int b = 1;
if (b) {
printf("Hello World");
}
Prints Hello World. Why ? Because 0 is false and 1 is true.
If you do quotient=(b)?(a/b):0; it is interpreted to is b true ? or in other words is b evaluated to 1 (while, again, 1 is true and 0 is false)
C did not originally have a Boolean type. Conditionals are simply int values in C. 0 is false, and any other value is truthy. If the type of b is int, or it can implicitly convert to int, then (b) ? foo : bar does the same thing as (b == 0) ? bar : foo. (However, b==0 will evaluate to 1 or 0, whereas b by itself might have other nonzero values that if or ? consider truthy.)

Strange things happen with bool? [closed]

Closed. This question is not reproducible or was caused by typos. It is not currently accepting answers.
This question was caused by a typo or a problem that can no longer be reproduced. While similar questions may be on-topic here, this one was resolved in a way less likely to help future readers.
Closed 5 years ago.
Improve this question
Why with variable a do I need to use the symbol =, but with variable b GCC tells me to use ==? Should they all being used with =, am I wrong or what? If I use a normal if, this thing doesn't happen.
P.S: I know about the <stdbool.h>.
Thanks everyone.
#define FALSE 0
#define TRUE 1
typedef int BOOL;
int main()
{
BOOL a;
BOOL b;
int num = 21; // random number
(num == 21) ? a = TRUE : b = TRUE;
return 0;
}
It's tricky at first. But there is a simple reason why GCC complains.
(num == 21) ? a = TRUE : b = TRUE;
Here, the colon operator takes precedence over equal to operator. So effectivey, this statement is evaluated as
((num == 21) ? a = TRUE : b) = TRUE;
which in turn is the same as
TRUE = TRUE;
So the compiler rightly complains that lvalue required as left operand of assignment. However, if you use parenthesis to correct the affinity, it won't complain.
(num == 21) ? (a = TRUE) : (b = TRUE); //No compiler error
If you were trying to do this:
(num == 21) ? a = TRUE : b = TRUE;
The syntax is invalid due to operator precedence. The ternary operator ?: has higher precedence than the assignment operator =. So the expression above is the same as:
((num == 21) ? a = TRUE : b) = TRUE;
This is invalid syntax because you can't have an expression like this on the left side of an assignment.
You need to add parenthesis to get the behavior you want.
(num == 21) ? a = TRUE : (b = TRUE);
Here is a better code using stdbool.h library. = & == are direfferent ! The first one is used for asignation and the second one for a comparing
#include <stdio.h>
#include <stdbool.h>
int main(void){
bool a = false;
bool b = false;
int num = 21; // random nr lol
bool result = (num == 21) ? true : false;
a = result;
b = !result;
return 0;
}
It is equivalent to
((num == 21) ? a = TRUE : b) = TRUE;
Thus, you are assigning to the result of expression, but not to the variable. Therefore compiler demands == operator.
Use
(num == 21) ? a = TRUE : (b = TRUE);
This type of syntax is called a ternary operator. They are generally used to perform simple expressions, or assign things to ONE variable based on a condition, rather than handle assignment logic with two variables.
This is why you can't have both a = TRUE and b = TRUE in the ternary operator. You should only have values or things that return values in there.
e.g.
BOOL result = (num == 21 ? TRUE : FALSE);
BOOL a = result;
BOOL b = !result;
Read more on ternary operators on Mozilla's documentation
Also, slightly unrelated to your actual question, but still an issue you should fix; Lee Daniel Crocker made a good point. FALSE shouldn't really be defined as 1, as it is usually defined as 0 in most programming contexts. TRUE is defined as any number other than 0, i.e. !FALSE. Hence, try doing this to define your TRUE and FALSE:
#define FALSE 0
#define TRUE !FALSE

what does the colon do in c?

I was given this example in class and I am unsure what it does. I understand the colon adds a bit-field, but I am still uncertain about this question:
a = b > 0 ? 3:1;
?: operator is called the conditional operator.
If b value is > 0, the value 3 is assigned to a else the value 1 is assigned to a.
Take your Kernighan & Ritchie book 2nd edition, chapter 2.11 Conditional expressions, the behavior of the operator is explained.
? is a conditional operator:
a = b > 0 ? 3:1;
is equivalent to:
if(b > 0)
a = 3;
else
a = 1;
This is the conditional operator. It's equivalent to:
if (b > 0)
a = 3;
else
a = 1;
Read it as "a = if b > 0 then 3 else 1".
It's the conditional operator (generally called the ternary operator), which is used as a short way of writing if statements.
In general, it can be read:
condition ? value_if_true : value_if_false
So, in your case:
a = b > 0 ? 3:1;
Can be rewritten as:
if(b > 0) a = 3;
else a = 1;
The colon in this example doesn't mean anything related to bit fields - it's just the second part of the conditional.

Resources