Почему вывод 0 в одном, но правильный ответ в другом?

Предположим, вам нужно найти площадь треугольника, зная основание и высоту.

#include <stdio.h>
int main ()
{
    float base,height,area;
    printf("Enter base and height of triangle: \n");
    scanf("%f%f",&base,&height);
    area=0.5*base*height;
    printf("The area of the triangle is %f",area);
    return 0;
}

Почему программа дает правильный ответ с приведенным выше кодом, но не с тем, что ниже??

#include <stdio.h>
int main ()
{
    float base,height,area;
    printf("Enter base and height of triangle: \n");
    scanf("%f%f",&base,&height);
    area=(1/2)*base*height;
    printf("The area of the triangle is %f",area);
    return 0;
}

Этот показывает 0 независимо от того, какие значения вы вводите. Какую очевидную вещь я здесь упускаю?

Второй вычисляет 1/2 как целое число, которое всегда равно 0.

J.P.S. 21.03.2022 14:46

В C оператор «/» возвращает только целую часть деления, поэтому формула для площади принимает вид 0 * основание * высота.

kmalarski 21.03.2022 14:47

попробуйте что-то вроде 1.0f/2 или 1/2.0f, чтобы сообщить компилятору, что вам нужно разделение с плавающей запятой.

yano 21.03.2022 14:48

Ни то, ни другое не правильно. Двоичный * имеет ассоциативность слева направо, поэтому в случае 0.5*base*height все выражение будет оцениваться как double.

Lundin 21.03.2022 14:51

@kmalarski пытается привести тип, это тоже не сработает?

students 21.03.2022 15:04

@Lundin извините, я не знаю, что это значит, не могли бы вы объяснить немного подробнее, пожалуйста?

students 21.03.2022 15:05

Это означает, что если вы используете типы float, вы всегда должны использовать константы с плавающей запятой, оканчивающиеся на f. То есть: 0.5f. В противном случае вы могли бы также использовать double везде (что, вероятно, в любом случае является правильным выбором, если программировать для ПК).

Lundin 21.03.2022 15:11

@Lundin ааа, хорошо, спасибо за объяснение

students 22.03.2022 09:40
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
8
41
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Выражение

(1/2)

делит два целых числа. В отличие от Python или некоторых других языков, это не будет неявно преобразовано в число с плавающей запятой, а останется целым числом. Следовательно, результат равен 0.

Изменение выражения на

(1./2)

решает вашу проблему.

Другие вопросы по теме