当输入为 2、3、4 时,为什么 s 返回 0?

Why s is returning 0 when inputs are 2,3,4?

#include<stdio.h>
#include<conio.h>

void main(){
  int a,b,c;
  float s,area;

  printf("Enter 3 sides of triangle:");
  scanf("%d %d %d",&a,&b,&c);

  s=(a+b+c)/2;
  printf("%d",s);

  area=sqrt(s*(s-a)*(s-b)*(s-c));
  printf("Area of triangle is : %.1f",area);
}

并解释按位补码运算符为什么 ~0 是 -1?它是如何工作的?

因为你在做整数除法,试试这个

s=((float)(a+b+c)) / 2.0;

如果你不投数字

s = (2 + 4 + 3) / 2 -> 9 / 2 - > 4

然后

area=sqrt(4*(4-2)*(4-3)*(4-4));
                      /*  ^ this is 0

因此

area=sqrt(4*2*1*0) -> sqrt(0) -> 0;

正如其他答案已经提到的,~ 按位运算符翻转它的操作数的位,这意味着如果你有数字 10,它的二进制表示是

00001010
^^^^^^^^   
11110101

如果你在上面应用 ~ 运算符,它就会变成

11110101 -> 245 // unsigned

变成245 - 256 = -11,见Two's complement

why s is returning 0 when inputs are 2,3,4?

因为你正在做 int 计算。

and also explain bitwise complement oprator why ~0 is -1??how it works????

假设8位,0为:

00000000

~0 是什么?

11111111

在二进制补码中它是 -1,因为如果您翻转所有位并将结果加 1,您将得到:

00000001

并且由于 MSB 为 1,因此结果为负。