• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed [c++] Nietypowa składnia polecenia if

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
0 głosów
509 wizyt
pytanie zadane 31 sierpnia 2020 w C i C++ przez VBService Ekspert (256,600 p.)
zamknięte 27 stycznia 2021 przez VBService

Witam, czy w podanych przykładach poniżej, taki zapis składni if:
if(...) if(..) if(...) { ... } , lub if(... , ... , ...) { ... } 
odpowiada łączeniu warunków za pomocą operatora logicznego and ( && ) , czy może jakaś inna reguła ?

#include <iostream>

int main()
{
    int a=2;
    
    for(int i=0; i<2; ++i) {
        std::cout << "a = " << a << "\n";

        if(1==1) if(2==2) if(a!=2) {
          std::cout << "True 1==1, 2==2, " << a <<"!=2\n";
        } else {
          std::cout << "False 1==1, 2==2, " << a <<"!=2\n";
        }
        a++;
    }   
   return 0;
}
#include <iostream>

int main()
{
    int a=2;
    
    for(int i=0; i<2; ++i) {
        std::cout << "a = " << a << "\n";

        if(1==1, 2==2, a!=2) {
          std::cout << "True 1==1, 2==2, " << a <<"!=2\n";
        } else {
          std::cout << "False 1==1, 2==2, " << a <<"!=2\n";
        }
        a++;
    }   
   return 0;
}
using System;
using System.IO;

class MainClass {
  static void Main(string[] args) {
    int a=2;

    for(int i=0; i<2; ++i) {
      Console.WriteLine("a = {0}", a);

      if(1==1) if(2==2) if(a!=2) {
        Console.WriteLine("True 1==1, 2==2, {0}!=2", a);
      } else {
        Console.WriteLine("False 1==1, 2==2, {0}!=2", a);
      }
      a++;
    }
  }
}

on-line: [ c++ ] [ c# ]

[ Edit ]

@tkz, dzięki za wskazówkę (odpowiedź) co do pierwszego:
if(...) if(..) if(...) { ... }, to jest zapis "drzewka" if-ów, w jednej linii

#include <iostream>
 
int main()
{
    int a=1;
    int b=2;
    int c=2;
    
    std::cout << "if-y w jednej linii\n";
    std::cout << "       a     b     c\n";
    for(int i=0; i<3; ++i) {
        if(a==1) if(b==2) if(c!=2)
            std::cout << "True  " << a << "==1, " << b << "==2, " << c <<"!=2\n";
        else
            std::cout << "False " << a << "==1, " << b << "==2, " << c <<"!=2\n";
        else
            std::cout << "False " << a << "==1, " << b << "==2, " << c <<"!=2\n";
        else
            std::cout << "False " << a << "==1, " << b << "==2, " << c <<"!=2\n";

        a++, b++, c++;
    }
    
    a=1;
    b=2;
    c=2;
    
    std::cout << "\n\ndrzewko if\n";
    std::cout << "       a     b     c\n";
    for(int i=0; i<3; ++i) {
        if(a==1)
            if(b==2)
                if(c!=2)
                    std::cout << "True  " << a << "==1, " << b << "==2, " << c <<"!=2\n";
                else
                    std::cout << "False " << a << "==1, " << b << "==2, " << c <<"!=2\n";
            else
                std::cout << "False " << a << "==1, " << b << "==2, " << c <<"!=2\n";
        else
            std::cout << "False " << a << "==1, " << b << "==2, " << c <<"!=2\n";

        a++, b++, c++;
    }
   return 0;
}

on-line: [ c++

Wygląda na to, że ostatni zapis po przecinku w warunku if jest sprawdzany,
czyli odpowiada łączeniu warunków za pomocą operatora logicznego or ( || ) ?

#include <iostream>
 
int main()
{
    int a=1;
    int b=2;
    int c=2;
     
    std::cout << "       a     b     c\n";
    for(int i=0; i<3; ++i) {
        if(a==1, b==2, c!=2)
          std::cout << "True  " << a << "==1, " << b << "==2, " << c <<"!=2\n";
        else
          std::cout << "False " << a << "==1, " << b << "==2, " << c <<"!=2\n";

        a++, b++, c++;
    }
   return 0;
}

on-line: [ c++ ]

komentarz zamknięcia: @tkz, udzielił satysfakcjonującej odpowiedzi - niestety w komentarzu ;-)

1 odpowiedź

0 głosów
odpowiedź 31 sierpnia 2020 przez Zaqu93 Gaduła (4,850 p.)

Taki zapis odpowiada logicznemu AND. Jeśli masz spełniony jeden warunek to dopiero sprawdza kolejny if węc:

if(x == 1) {
   if(y==1) {

}
}

 

komentarz 31 sierpnia 2020 przez VBService Ekspert (256,600 p.)

Tak, ale tu są "zagnieżdżone" warunki: 
if(...) { if(...) { ... } }
a ja pytam o taką składnię:
if(...) if(..) if(...) { ... } , lub if(... , ... , ...) { ... } ,
która działa i kompilator nie zgłasza żadnych błędów składni.

1
komentarz 31 sierpnia 2020 przez tkz Nałogowiec (42,060 p.)

Operator przecinka w C++ w tym przypadku jest użyty kompletnie bezzasadnie. 

if(1==1, 2==2,3==3)

Efekt tego wyrażenia będzie taki, jak jego ostatni warunek(czytaj po ostatnim przecinku). 
Abstrahując od użyteczności, drzewko if'ów jest kompletnie nieczytelne, więc masz powód dlaczego go nie stosować. 

if(1==1) 
    if(2==2) 
        if(4!=2) 
        {
          std::cout << "True 1==1, 2==2, " << a <<"!=2\n";
        } else 
        {
          std::cout << "False 1==1, 2==2, " << a <<"!=2\n";
        }

A co jeżeli pierwszy if będzie fałszem? Za dużo zbędnego kodu. 

Odpowiadając na pytanie. Drugi kod niejako spełnia założenia and'a(no może oprócz tego else...). 

1
komentarz 31 sierpnia 2020 przez jankustosz1 Nałogowiec (36,960 p.)

Możesz nawet tak zrobić:

for(int i = 0; i<10; i++)
 for(int j = 0; j<10; j++)
  cout << i << " " << j << endl;

Jak jest tylko jedna operacja to nie trzeba dawać nawiasów klamrowych

1
komentarz 31 sierpnia 2020 przez Zaqu93 Gaduła (4,850 p.)

Jeżeli wykonujesz if dla jednej operacji nie trzeba dodawać nawiasów klamrowych, tak samo jest np. pętli for gdzie możesz zapisać to tak:

for(int i = 0; i < 10; i++)
   for(int j = 0; j < 5; j++)
      //kod

Tak samo jest z if:

if(x==1) if(y==2){
   //kod
}

To jest to samo co:

if(x == 1)
   if(y == 2) {
      //kod
}

oraz

if(x==1) if(y==2) {
   //kod
}

 

Podobne pytania

0 głosów
0 odpowiedzi 242 wizyt
pytanie zadane 8 kwietnia 2017 w Java przez Jonki Dyskutant (8,180 p.)
0 głosów
3 odpowiedzi 267 wizyt
0 głosów
1 odpowiedź 435 wizyt
pytanie zadane 9 maja 2023 w C# przez JohnyBravo Nowicjusz (120 p.)

93,440 zapytań

142,431 odpowiedzi

322,678 komentarzy

62,802 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

...