With eZ Publish you can have multiple location content. Criterions do not relate to others criterion you can  use the Public API and Criterion to search this content, it can lead to a comportement you are not expecting.
Example of Criterions not relating to each other:
There is a Content with two Locations: Location A and Location B
Searching with LocationId criterion with Location B id and Visibility criterion with Visibility::VISIBLE will return the Content because conditions are satisfied:
use eZ\Publish\API\Repository\Values\Content\Query;
use eZ\Publish\API\Repository\Values\Content\Query\Criterion\LogicalAnd;
use eZ\Publish\API\Repository\Values\Content\Query\Criterion\LocationId;
use eZ\Publish\API\Repository\Values\Content\Query\Criterion\Visibility;
/** @var string|int $locationBId */
/** @var \eZ\Publish\API\Repository\Repository $repository */

$searchService = $repository->getSearchService();
$query = new Query(
        'filter' => new LogicalAnd(
                new LocationId( $locationBId ),
                new Visibility( Visibility::VISIBLE ),
$searchResult = $searchService->findContent( $query );
// Content is found
$content = $searchResult->searchHits[0];