Mer C hjälp... char och if

Tråden skapades och har fått 11 svar. Det senaste inlägget skrevs .
1
#include <stdio.h>

int main(void)
{
        char tecken='1';

        if(tecken)
        {
                printf("hej\n");
        }

        printf("bla\n");
        return 0;
}

Vad säger if satsen när den kontrollerara en char?
Att char har ett värde eller att den existerar?
För satsen i detta exempel är alltid sann oavsett vilket värde jag ger 'tecken'.
Vad ska jag ge 'tecken' för värde för att if satsen ska anse det som falskt?

Förklara gärna lite mer än bara skriva värdet.

Tack!

  • Oregistrerad
  • 2004-10-10 19:09

Du evaluerar och returnerar värdet av 'tecken', C tolkar 0 som falskt och 1 (igentligen allt annat än 0) som true. Så detta fall returneras 49 som sedan gör att if-satsen blir sann

Hmmm ser ingen annan utväg än att publicera hela mitt problem.
Kommentenrarerna och indenteringen är min inte koden. Jag ska analysera koden förstå vad som händer och göra en ändring så att "Vad händer?" skrivs ut.

#include <stdio.h>

int main(void)
{
	int tal=0, i=1;
	char tecken = '0'; // '0' är inte noll utan 48.
	
	if(tecken && i) // om tecken OCH i var för sig är mer än noll.
	if(tal || i) // om tal ELLER i var för sig är mer än noll.
		if(!tal); // om tal är noll.
		
	else if(!i) // om i är noll.
	{
		if(tal+i) // om tal+i är mer än 0.
			printf("Hej på er!\n");
	}
	else
		printf("Vad händer?\n");
	
	printf("Nu är det slut!\n");
	return 0;
}

Jag har ändrat fram och tillbaka på variabler och inget hjälper.
Nycklen ligger i att förstå vilken if sats elseif tillhör...
tror jag.

Vad som händer

#include <stdio.h>

int main(void)
{
	int tal=0, i=1;
	char tecken = '0';
	
	// kommer att gå in i denna if sats
	if(tecken && i)
		// och in i denna
		if(tal || i)
			// och denna
			if(!tal);
			// och gör ingenting

	// skippar denna
	else if(!i)
	{
		if(tal+i)
			printf("Hej på er!\n");
	}

	// skippar denna oxå
	else
		printf("Vad händer?\n");
	
	// och skriver ut följande
	printf("Nu är det slut!\n");
	return 0;
}

Om du ändrar tecken till 0:

#include <stdio.h>

int main(void)
{
	int tal=0, i=1;
	char tecken = 0;
	
	// kommer ej gå in i denna if sats (eftersom tecken = 0)
	if(tecken && i)
		if(tal || i)
			if(!tal);

	// skippar denna
	else if(!i)
	{
		if(tal+i)
			printf("Hej på er!\n");
	}

	// och går in i denna
	else
		printf("Vad händer?\n");
	
	// och skriver ut följande
	printf("Nu är det slut!\n");
	return 0;
}
  • Medlem
  • Stockholm
  • 2004-10-10 19:58
if(tecken && i) // om tecken OCH i var för sig är mer än noll.

Fel.
Precis som Moström skrev så kontrollerar IF om satsen evaluerar till NULL (NULL är inte 0 i C har jag för mig) och för allt annat är den 'true'.

if(tecken && i) // kan skrivas if( (tecken != NULL) && (i != NULL))

 // om tecken OCH i var för sig är mer än noll.
if(tecken && (i > 0))
if(tal || i) // om tal ELLER i var för sig är mer än noll.
		if(!tal); // om tal är noll.

Fel. Godkänner alla värden som inte är NULL.

if((tal >0) || (i>0)) // om tal ELLER i var för sig är mer än noll.
else if(!i) // om i är noll.
	{
		if(tal+i) // om tal+i är mer än 0.
			printf("Hej på er!\n");
	}

Fel
som åvan, så länge som i är satt till något annat än NULL så godkänns if-satsen.
som åvan, så länge tal+1 inte blir NULL så godkänns if-satsen.

else if(i == 0) // om i är noll.
	{
		if((tal+i) > 0) // om tal+i är mer än 0.
			printf("Hej på er!\n");
	}
  • Medlem
  • Stockholm
  • 2004-10-10 19:37

Kan du inte ändra "else if(!i)" till "else if(i != 1)"?

Så skulle jag lösa det iaf.

Nej Hagelin... det har jag testat.
Jag har nu löst det mha samuelk. SUPER DUPER TACK till honom.

Indenteringen är "fel". När jag lät Xcode göra indenteringen så fick jag det som samuel sa. Undrar om det håller när jag skriver det... Xcode hjälpte mig...

else satserna tillhör sista if satsen. De två första är bara tillför att förvirra.
Om du ser det så blir det hela lätt. Sätt tal till 1 och i till 1.
Saken är biff.

#include <stdio.h>

int main(void)
{
	int tal=1, i=1;
	char tecken = '0';
	
	if(tecken && i)
		if(tal || i)
			if(!tal);
			else if(!i)
			{
				if(tal+i)
					printf("Hej på er!\n");
			}
				else
					printf("Vad händer?\n");
	printf("Nu är det slut!\n");
	return 0;
}

Tack!
Nu fattade jag mer av vad Mosträm skrev.

  • Oregistrerad
  • 2004-10-10 20:04

Nu är jag inte 100 på senaste specen av C, det är några år sedan jag skrev i C sist, men jag tror att NULL är definerat som 0L (???) (för pekare etc) medans true/false är nog definerat som integer (0). Men jag kan ha fel, i vilket fall skulle jag rekommendera:

#define TRUE 1
#define FALSE 0

Fast det finns nog redan i nån header-fil nu för tiden.

  • Oregistrerad
  • 2004-10-10 20:06

Jodå, Samuel han kan Om jag skulle ge dig ett tips i sådana här fall så använder du { och } ÖVERALLT där de kan finnas (jag gör det nästan i 100% av fallen). PÅ det viset undviker man att man läser fel (eller skriver nåt som kompilatorn "misstolkar").

  • Medlem
  • Stockholm
  • 2004-10-10 20:10

Justja, kan nämnas att jag snackar om C enligt ANSI/ISO-standarden (1989).

Ajdå, jag hade fel om if/else-satserna, jag som var så säker. Dock tror jag faktiskt att tecken = 0 är false. Helt säker, eftersom jag precis testade det.

Litet tillägg:
Nu när jag tänker på det, så tror jag att jag körde på en tenta för ett antal år sedan pga ett liknade if/else problem. Usch.

Senast redigerat 2004-10-10 20:45
1
Bevaka tråden