• 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

Object Storage Arubacloud
0 głosów
278 wizyt
pytanie zadane 31 sierpnia 2020 w C i C++ przez VBService Ekspert (253,100 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 (253,100 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,000 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 (35,880 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 179 wizyt
pytanie zadane 8 kwietnia 2017 w Java przez Jonki Dyskutant (8,180 p.)
0 głosów
3 odpowiedzi 187 wizyt
0 głosów
1 odpowiedź 208 wizyt
pytanie zadane 9 maja 2023 w C# przez JohnyBravo Nowicjusz (120 p.)

92,555 zapytań

141,403 odpowiedzi

319,557 komentarzy

61,940 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...