what is the explanation of output of given program [closed] - c

Closed. This question does not meet Stack Overflow guidelines. It is not currently accepting answers.
This question appears to be off-topic because it lacks sufficient information to diagnose the problem. Describe your problem in more detail or include a minimal example in the question itself.
Closed 8 years ago.
Improve this question
the output of following code is
2 1
3 1
4 1
5 1
6 1
7 0
Anyone can please explain?
#include<stdio.h>
int main()
{
int x=1, y=1;
for(; y; printf("%d %d\n", x, y))
{
y = x++ <= 5;
}
printf("\n");
return 0;
}

Here is your program reformulated. I think that the behavior is obvious.
#include<stdio.h>
int main() {
int x=1, y=1;
while (y != 0) {
if (x <= 5) y = 1;
else y = 0;
x = x + 1;
printf("%d %d\n", x, y)) ;
}
printf("\n");
return 0;
}

Its fairly straightforward - you have
for(; y; printf("%d %d\n", x, y))
{
y = x++ <= 5;
}
Initially x=1, y=1.
On first pass: y = x++ <= 5; means y = 1++ <= 5 (so to say) hence by the of this statement - x=2, y=1 - since 1<=5 evaluates to 1
On second pass: y = x++ <= 5; means y = 2++ <= 5 (so to say) hence by the of this statement - x=3, y=1 - since 1<=5 evaluates to 1
and it goes on like this until we get y=0 when x++ <= 5 evaluates to 6++ <= 6 and then in the for loop for(; y; printf("%d %d\n", x, y)) the condition evaluates to false since y is 0.

y is used as condition in for loop where as you are printing the data in place of incrementation. As printf returns int, it is totally valid.
y = x++ <= 5;
Means increment x and check if value of x <=5. if it is then y = 1, otherwise y=0.
If y=0, it will end the loop.
The program can also be written like.
#include<stdio.h>
int main()
{
int x=1, y=1;
while(y)
{
printf("%d %d\n", x, y)
x++;
if(x <= 5)
y=1;
else
y=0;
}
printf("\n");
return 0;
}

Related

program does not scans the number 149, and for any other number it returns 0 [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 3 years ago.
Improve this question
my program should be scanning a certain number (unsigned long int) and returns its odd 'turned on' indexes bits(from the binary representation of the number). but the program doesn't identify any numbers, and just returns 0, or ,does not respond at all to the number. what am i doing wrong ?
this is the fucntion:
int count_odd_bits(unsigned long int x) {
int count = 0;
while (x) {
if ((x % 2 == 1) && (x & 1))
count++;
else
x = x << 1;
}
return count;
}
this is the main function:
int main() {
unsigned long int x;
printf("\n enter a number: \n");
scanf("%ul", &x);
int count_odd_bits(unsigned long int x);
printf("\n the result is:%d \n",count_odd_bits(x));
return 0;
}
for the number 149 it should return 1
(only bit number 7 is turned on)
In the function you don't change x when the if is true. So you'll end up in an endless loop.
int count_odd_bits(unsigned long int x) {
int count = 0;
while (x) {
if ((x % 2 == 1) && (x & 1))
count++; // x not changed --> endless loop!!
else
x = x << 1;
}
return count;
}
Further it seems you need x = x >> 1; instead of the current code.
Also you don't need both x % 2 == 1 and x & 1 as they are the same.
So the code to count the number of ones could be:
int count_odd_bits(unsigned long int x) {
int count = 0;
while (x) {
if (x & 1) count++;
x = x >> 1;
}
return count;
}
If you only want to count odd bit position do
int count_odd_bits(unsigned long int x) {
int count = 0;
x = x >> 1; // get rid of bit zero
while (x) {
if (x & 1) count++;
x = x >> 2; // shift by 2 to get 1->3->5->....
}
return count;
}

Recursive function C multiplying by 4 problem

I'm supposed to write a program in C for school where I multiply by 4 but I can't get it to work. When I type 2 I get 20, when I type 3 it's 84, when I type 4 it's 340 and so on, why is that?
#include <stdio.h>
int multi(int i)
{
if (i == 1) {
return 4;
}
if (i == 0) {
return 0;
}
if (i > 1) {
return (multi(i-1)*4)+4;
}
}
int main()
{
int i;
printf("type a numer for multiplication by 4\n");
scanf("%d",&i);
printf("%d * 4 is %d\n",i, multi(i));
}
Multiplying X by Y is adding X Y number of times.
X * Y = X + X + X ...Y times
So change
return (multi(i-1)*4)+4;
to
return multi(i-1) + 4;
and it will work as intended for multiplication by 4.
However, if you want to raise X to the power of Y, you have to multiply X Y number of times.
X to the power of Y = X * X * X...Y times
In this case, there are a couple of more changes you have to make to your code which I leave to you as an exercise.

how to multiply values from table in c

I am new to programming and have been asked to create a table with 3 variables x, y and z.
To create x and y, I was asked to use a for loops and have does so. For z, I have to multiply the values of x and y but I'm not entirely sure how to work out z and how to place it in a table.
Please help. I have given an example of how my results should be.
What I've done so far:
int x, y, z;
for (x = 1; x <= 4; x++)
printf(" %d ", x);
for (y = 2; y <= 5; y++)
printf(" %d ", y);
return 0;
The data structure should be not complex
int matrix[3][5];
for(i=0; i<5;i++){
matrix[0][i]=i+1;
matrix[1][i]=i+2;
matrix[2][i]=matrix[0][i]*matrix[1][i];
}
You can change to char matrix to include your headers
You could see that course
https://www.edx.org/course/c-programming-pointers-and-memory-management
If the task is only to print a table, like the one posted, all you need is one loop:
#include <stdio.h>
int main(void)
{
// print the header of the table
puts("======================\n x y z = x * y\n----------------------");
for ( int x = 1; // initialize 'x' with the first value in the table
x <= 5; // the last value shown is 5. 'x < 6' would do the same
++x ) // increment the value after each row is printed
{
int y = x + 1; // 'y' goes from 2 to 6
int z = x * y; // 'z' is the product of 'x' and 'y'
// print each row of the table, assigning a width to each column,
// numbers are right justified
printf("%3d %3d %3d\n", x, y, z);
}
puts("======================");
return 0;
}
The output beeing
======================
x y z = x * y
----------------------
1 2 2
2 3 6
3 4 12
4 5 20
5 6 30
======================
int x[] = {1,2,3,4,5,.....} <-----for storing values of x
int y[] = {2,3,4,5,6,....} <------for storing values of y
Take another array for storing z values.
So now we have z[i]=x[i]*y[i] where i=0,1,2,........n also y[i]=x[i]+1
Use a loop to calculate and print the result.

C: help me understanding the output

can any one help me understanding the output of this code?
#include <stdio.h>
int main()
{
int x = 1, y = 1;
for(; y; printf("%d %d \n", x, y))
{
y = x++ <= 5;
}
return 0;
}
the output is:
2 1
3 1
4 1
5 1
6 1
7 0
A for loop in the form of
for (a; b; c)
{
d;
}
is equivalent to
{
a;
while (b)
{
d;
c;
}
}
Now if we take your loop
for(; y; printf("%d %d \n", x, y))
{
y = x++ <= 5;
}
It is equivalent to
{
// Nothing
// Loop while y is non-zero
while (y)
{
// Check if x is less than or equal to 5, assign that result to y
// Then increase x by one
y = x++ <= 5;
printf("%d %d \n", x, y);
}
}
Now it should hopefully be easier to understand what's going on.
Also: Remember that for boolean results (like what you get as result from a comparison), true is equal to 1, and false is equal to 0.
The code is an obfuscated, ugly version of this:
#include <stdio.h>
#include <stdbool.h>
int main()
{
int x = 1;
bool y = true;
while(y == true)
{
y = (x++ <= 5);
printf("%d %d \n", x, (int)y);
}
return 0;
}
y in the original code serves as a boolean. Back in the ancient days, there were no boolean type in C so it was common to use int instead. The expression y = x++ <= 5; evaluates to 0 or 1, which is equivalent to false or true.
Note:
While the C language allows all manner of crazy stuff, you should never write for loops as in the original code. De facto standard is to write for loops like this:
The first clause of a for loop shall only contain iterator initialization.
The second clause should only contain the loop condition.
The third clause should only contain a change of the loop iterator, such as for example an increment (like i++).
A for loop that doesn't follow the above industry standard rules is badly written, no excuses.
The statement y = x++ <= 5; sets y to 1 if x is less than or equal to 5, or to 0 if x is greater than 5. It then increments x. The loop stops when y is equal to 0, that is, on the iteration after x was incremented above 5. Then it runs the printf() statement on each iteration.
You wouldn’t normally see a loop switch the loop condition and the loop body that way. This seems to be a pathological example of how it’s technically legal. You shouldn’t imitate it.
y is 1 (true) as long as x <= 5 and x increases every iteration.
Rewrite your code:
for (int x = 1, y = 1; y; y = x <= 5, x++) {
printf("%d %d\n", x, y);
}
or using while
int x = 1;
int y = 1;
while (y) {
printf("%d %d\n", x, y);
x++;
y = x <= 5;
}
The first component of the for loop is empty; which means values of variables haven't changed. The condition in the for loop is y. Which means that the loop will run till the condition y is true; which means till the value of y is anything other than 0.
When the value of y becomes equal to 0; the condition will become false and the loop will stop iterating.
Then comes the block execution...
y = x++ <= 5;
Here first the condition x <= 5 is checked. Note that x++ is post increment and so the value of x will be incremented after the execution of the statement. So, if the value of x was 1 before increment; it will check 1 <= 5 and not 2 <= 5 and after the execution of the statement; the value will become 2.
After that comes the third component of for loop which is the increment part. Here,
printf("%d %d \n", x, y)
simply prints x and y.
So, what happens is; when the loop starts, both x and y are 1.
The statement
y = x++ <= 5;
is encountered, thus the condition x++ <= 5 is checked, where x is 1. Since the condition is true; the value of y will be 1 and x will be incremented to 2. The same thing continues.... when x will be equal to 5, x++ <= 5 will check 5 <= 5 and the condition will be true and x will be incremented to 6. Now when it goes in the loop the next time; the condition will be false and y will instead be equal to 0. Thus, now when the loop checks the condition y, the condition will be false and thus the control will flow out of the loop and thus you see the result.
I built and dumped this code in IDA since I understand assembly better :D
This code is a bit obfuscated so here will be the normal version of it:
#include <stdio.h>
int x = 1;
int y = 1;
while(y != 0) {
if(x++ <= 5)
{
y = 1;
} else {
y = 0;
}
printf("%d %d\n",x,y);
}
that for loop in the source:
for(; y; printf("%d %d \n", x, y))
checks if y is a non-zero value and if it is, it will print the string you want. In the body of the loop, the result of the comparison (0 or 1) will be copied to y and the check continues.
Precedence of operator <= is higher than the operator =.
So, the statement:
y = x++ <= 5;
is equivalent to:
y = (x++ <= 5)
Because of post-increment ++ operator, the value of x returned first and then x is incremented.
The initial value of both x and yis 1.
Since y is 1, the for loop condition evaluates to true and the statement in the for loop block executed. But in the for loop of your code, in place of loop iterator update statement you have printf() statement which is printing the value of x and y after executing the loop body statements. The flow goes like this:
1 <= 5 evaluate to 1 which is assigned to y and after this x is 2,
Output : 2 1
2 <= 5 evaluate to 1 which is assigned to y and after this x is 3,
Output : 3 1
3 <= 5 evaluate to 1 which is assigned to y and after this x is 4,
Output : 4 1
4 <= 5 evaluate to 1 which is assigned to y and after this x is 5,
Output : 5 1
5 <= 5 evaluate to 1 which is assigned to y and after this x is 6,
Output : 6 1
6 <= 5 evaluate to 0 which is assigned to y and after this x is 7,
Output : 7 0
Now the value y is 0 and in your code, the for loop condition is y so the loop condition evaluates as false and loop exits.

Control Instructions in C

I am not understanding for loop statement and expression following it. Please do help me understand.
#include<stdio.h>
int main()
{
int x = 1;
int y = 1;
for( ; y ; printf("%d %d\n",x,y))
y = x++ <= 5;
return 0;
}
And the output I got
2 1
3 1
4 1
5 1
6 1
7 0
y = x++ <= 5; ==> y = (x++ <= 5); ==> first compare x with 5 to check whether x is small then or equals to 5 or not. Result of (x++ <= 5) is either 1, 0 assigned to y,
As x becomes > 5, (x++ <= 5) becomes 0 so y = 0 and condition false and loop break,
Basically the for syntax is:
for(StartCondition; Test; PostLoopOperation) DoWhileTestPasses;
In this case:
StartCondition == None
Test == (y != 0)
PostLoopOperation == do some printing
DoWhileTestPasses == set y to zero if x > 5 otherwise to non-zero THEN increment x.
Which is all rather bad practice because it is confusing.
Would be better written as:
int x=0;
int y=0;
for(y=0; y = (x <= 6); x++)
{
printff("%d %d\n",x,y);
}
return(0);
In y = x++ <= 5;, y stores the value that is output by the condition x++ <= 5 (here x++ is post increment). If the condition is true then y = 1 else y = 0.
for( ; y ; printf("%d %d\n",x,y))
In the for loop you are printing the values of x and y after executing the for loop body.
Initialize your variables:
int x = 1; int y = 1;
There are 3 statements for the for loop: -1. Initialize, 2. Condition, 3. Iteration:increment/decrement
In your case, you did not provide the initialize condition, however, you have the part of condition and incrementation. I do not think your for loop is used in the correct way.
You should swap the part of incrementation with your body like this:
for(; y; y = x++ <= 5;)
printf("%d %d\n", x, y)
First, you check whether the condition is true or not, y is true or not. Then, you print x and y out. Then, the part of incrementation is executed, x++ <= 5 or not. The result is assigned to y. It does so until your condition is false, y == false.
NOTE: For the good programming, you should enclose your body with a curly braces.
similar to this
int x = 1;
for( int y = 1; y!=0 ; )
{
if (x++ <= 5)
{
y = 1;
}
else
{
y = 0;
}
printf("%d %d\n",x,y);
}
Perhaps this slightly transformed (but functionally equal) code will help:
int x = 1;
int y = 1;
while (y) {
y = (x <= 5);
x = x + 1;
printf("%d %d\n", x, y)
}

Resources