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

Warunek ze znakiem (? :) (C++)

Object Storage Arubacloud
0 głosów
210 wizyt
pytanie zadane 26 marca 2018 w C i C++ przez Sic Dyskutant (8,510 p.)
(ps[i] > max) ? max = ps[i] : break;

Kompilator pokazuje mi błąd z 'break', dlaczego ?

2 odpowiedzi

+1 głos
odpowiedź 26 marca 2018 przez niezalogowany
wybrane 26 marca 2018 przez Sic
 
Najlepsza

Masz potrójny operator warunkowy, który w zasadzie ma zwracać wartość. Instrukcja break nie może nic zwracać dlatego wyskoczy błąd. Możesz zrobić tak, ale już lepiej skorzystać z if/else.

template <typename T, typename T2>
void maxn(T * ps, int n, T2 max)
{
	bool exit = false;
	max = ps[0];
	for (int i = 0; i<n && !exit; i++)
		(ps[i] > max) ? max = ps[i] : exit = true;
	std::cout << max << std::endl;
}

W innej sytuacji kompilator w Visual Studio pozwoli na zamieszczenie dwóch wyrażeń o różnych zwracanych typach czyli np int i void (jako np funkcje) czego np clang czy gcc nie zrobi. 

komentarz 26 marca 2018 przez Sic Dyskutant (8,510 p.)
edycja 26 marca 2018 przez Sic
Dziękuje wykorzystam oba, chciałem spróbować innego sposobu.

A mógłbym prosić o wyjaśnienie 'exit' ? Bo staram się zrozumieć cały zarys pętli z jego wykorzystaniem.
komentarz 26 marca 2018 przez niezalogowany
Pętla ma warunek, że będzie wykonywać się tak długo jak i < n AND exit == false (lub exit != true, lub !exit w skróconej formie). Gdy z w ciele pętli zmiennej exit zostanie nadana wartość true to przy kolejnym cyklu podczas sprawdzania warunek będzie nieprawdziwy więc pętla zakończy się.
komentarz 26 marca 2018 przez Sic Dyskutant (8,510 p.)
Dziękuję  wykorzystywanie warunków to nie taka prosta sprawa.
komentarz 26 marca 2018 przez mokrowski Mędrzec (155,460 p.)

@Hipcio,

... w zasadzie ma zwracać wartość

Nawet nie "w zasadzie" a zawsze zgodny typ. Stąd wynikają ciekawe właściwości tego operatora:

#include <iostream>
#include <vector>

int main() {
    std::vector<int> values{1, 2, 32, 55, 43, 42, 2};
    size_t divided_3{};
    size_t not_divided_3{};
    for(auto& val: values) {
        ++(val % 3 == 0 ? divided_3: not_divided_3);
    }
    std::cout << "Liczb podzielnych przez 3: " << divided_3
        << "\nLiczb nie-podzielnych przez 3: " << not_divided_3
        << "\nRazem liczb jest: " << divided_3 + not_divided_3
        << "\nWielkość kontenera danych: " << values.size()
        << '\n';
}

Każdy sam oceni czy to jest czytelne czy nie... 

komentarz 26 marca 2018 przez Sic Dyskutant (8,510 p.)
A co się dzieję w tym kodzie ?(?) Wybacz ale nie za bardzo rozumiem. Spotkałem się kiedyś ze vector ale nie na takim poziomie.
1
komentarz 26 marca 2018 przez mokrowski Mędrzec (155,460 p.)
Do std::vector wrzucam jakieś wartości, tworzę 2 liczniki, iteruję po wszystkich wartościach z std::vector, wybieram który licznik inkrementować w zależności od tego czy wartość jest podzielna przez 3 czy nie. Dalej prezentacja danych.

Całość zgodna z C++11.
komentarz 27 marca 2018 przez Sic Dyskutant (8,510 p.)
Dzięki, wiele się jeszcze muszę nauczyć.
0 głosów
odpowiedź 26 marca 2018 przez event15 Szeryf (93,790 p.)
Bo nie jest to ani pętla, ani switch.
komentarz 26 marca 2018 przez Sic Dyskutant (8,510 p.)
edycja 26 marca 2018 przez Sic

warunek jest ujęty w pętle

template <typename T, typename T2>
void maxn(T * ps, int n, T2 max)
{	
	max = ps[0];
	for(int i=0; i<n; i++)
		(ps[i] > max) ? max = ps[i] : break;
	std::cout << max << std::endl;	
}

 

Podobne pytania

0 głosów
2 odpowiedzi 143 wizyt
0 głosów
0 odpowiedzi 108 wizyt
pytanie zadane 3 kwietnia 2018 w JavaScript przez Kano Nowicjusz (200 p.)
0 głosów
2 odpowiedzi 281 wizyt
pytanie zadane 13 maja 2018 w Rozwój zawodowy, nauka, praca przez Sic Dyskutant (8,510 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!

...