鱼C论坛

 找回密码
 立即注册
123
返回列表 发新帖
楼主: 11063216906

[已解决]浮点数存取问题

[复制链接]
 楼主| 发表于 1 小时前 | 显示全部楼层
FishC 发表于 2026-6-20 11:20
确实不是这样。让我用通俗的方式帮你理清浮点数的实际存储机制。

首先,float 类型在内存中占用固定的32 ...

C语言中 double类型强制转化int 是四舍五入还是小数裁剪
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 1 小时前 | 显示全部楼层
11063216906 发表于 2026-08-06 21:51
FishC 发表于 2026-6-20 11:20
确实不是这样。让我用 ...


在 C 语言中,将 double 强制转换成 int 时,既不是四舍五入,也不是简单的“向下取整”,而是 **直接截断小数部分**,也就是 **向零取整**(truncation towards zero)。

例如:
- (int)3.99  结果是 3
- (int)-3.99 结果是 -3

注意区别:
- 向零取整:3.99 变成 3,-3.99 变成 -3
- 向下取整(floor):3.99 变成 3,-3.99 变成 -4

所以它把小数部分直接扔掉,正数和负数都往零的方向靠拢。

如果你希望四舍五入,需要使用标准库中的 round() 函数,例如 int x = (int)round(3.6); 结果为 4。

如果小数超出 int 能表示的范围,结果是未定义行为,编译器可能给出错误值或异常,建议转换前先检查范围。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 半小时前 | 显示全部楼层
@FishC
  1. case 'a':
  2.                         case 'A': a++;
  3.                                   break;
复制代码

这种写法a的情况下不会报错吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 半小时前 | 显示全部楼层
11063216906 发表于 2026-08-06 22:05
@FishC case 'a':
                        case 'A' ...

这种写法完全不会报错,而且是 C 语言中非常常见的“多标签共用一段代码”的写法。


case 'a':case 'A': 紧挨着写时,如果表达式的值是 'a''A',都会执行后面的 a++;,直到遇到 break; 才会跳出 switch。

所以这段代码的意思是:无论输入小写 a 还是大写 A,变量 a 都会自增 1。

  1. switch (ch) {
  2.     case 'a':
  3.     case 'A':
  4.         a++;
  5.         break;
  6. }
复制代码


这种写法简洁高效,不用写两遍 a++;,放心使用。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 半小时前 | 显示全部楼层
FishC 发表于 2026-8-6 22:05
当 case 'a': 和 case 'A': 紧挨着写时,如果表达式的值是 'a' 或 'A',都会执行后面的 a++;,直到 ...

我该如何用gcc去编译c语言代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 半小时前 | 显示全部楼层
11063216906 发表于 2026-08-06 22:09
FishC 发表于 2026-8-6 22:05
当 case 'a': 和 case  ...


在命令行中,使用 gcc 编译 C 代码的基本格式是:

gcc 源文件名.c -o 输出文件名

例如,你有一个 hello.c 文件,想生成可执行程序 hello,就输入:

gcc hello.c -o hello

编译成功后会生成一个名为 hello 的可执行文件(Windows 下是 hello.exe),运行它:

./hello

如果不想指定输出文件名,直接输入 gcc hello.c,默认生成 a.out(Windows 下是 a.exe)。

如果你需要开启警告和调试信息,可以加上 -Wall -g,比如:

gcc -Wall -g hello.c -o hello

如果你的代码使用了数学库(比如 sqrt、pow),编译时需要链接数学库,加 -lm:

gcc hello.c -o hello -lm

如果有多个源文件一起编译,直接全部列出来:

gcc main.c helper.c -o program

这样就能轻松编译运行你的 C 代码了。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 半小时前 | 显示全部楼层
FishC 发表于 2026-8-6 22:09
在命令行中,使用 gcc 编译 C 代码的基本格式是:

gcc 源文件名.c -o 输出文件名

expected identifier or '(' before numeric constant
这是什么报错
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 半小时前 | 显示全部楼层
11063216906 发表于 2026-08-06 22:17
FishC 发表于 2026-8-6 22:09
在命令行中,使用 gcc  ...


这个报错通常表示你在不该出现数字的地方写了数字,常见原因是:你把数字当成了宏名、变量名或者函数名来使用。

例如:

  1. #define 5 100
  2. int main() { return 0; }
复制代码


或者:

  1. int 5a = 10;
复制代码


或者某个宏展开后变成了一个数字开头的东西,比如:

  1. #define NUM 10
  2. int NUM;
复制代码


不过上面这个其实是合法的(NUM 是宏名),真正常见的是:

  1. int 123abc;
复制代码


这行代码中,123abc 以数字开头,不是合法的标识符,编译器看到数字 123 后面跟着字母时,就会报出这个错误。

另一个典型场景是:你把宏定义写成这样:

  1. #define 3.14 PI  // 错误!宏名不能是数字开头
复制代码


修复方法很简单:检查出错的行(编译器通常会提示行号),把所有以数字开头的名字改成合法的标识符(字母或下划线开头),并且不要把数字字面量用作宏名。

如果你把代码贴出来,我可以帮你具体指出哪一行有问题。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 25 分钟前 | 显示全部楼层
FishC 发表于 2026-8-6 22:17
这个报错通常表示你在不该出现数字的地方写了数字,常见原因是:你把数字当成了宏名、变量名或者函数名 ...

我在使用getchar这个函数的时候
  1. char ch = getchar();
  2. while(ch != '\n')
复制代码

程序会卡死不动
但我
  1. while((char ch = getchar()) != '\n')
复制代码

就没有问题 这是为什么
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 24 分钟前 | 显示全部楼层
11063216906 发表于 2026-08-06 22:28
FishC 发表于 2026-8-6 22:17
这个报错通常表示你在 ...


你说得对,程序“卡死”其实就是**死循环**,而不是电脑卡住了。原因在于两种写法中 `getchar()` 被调用的次数完全不同。

先看第一种写法:

char ch = getchar();
while (ch != '\n')
{
    // 循环体
}

这里 `getchar()` 只在循环前执行一次。如果第一次读到的字符不是换行符,那么 `ch` 的值就永远是那个字符。只要循环体里没有再次修改 `ch`(也没有 `break` 跳出),条件 `ch != '\n'` 就一直成立,于是无限循环,看起来就像卡死。

再看你写的第二种:

while ((char ch = getchar()) != '\n')
{
    // 循环体
}

这里 `getchar()` 被放在了循环条件里,每次循环开始都会重新读取一个字符。所以它会不断读入下一个字符,直到读到换行符为止,不会死循环。

不过要注意:在标准 C 语言中,`while` 的条件里不能这样定义变量,`while ((char ch = getchar()) != '\n')` 实际上是语法错误(C++ 部分标准允许)。正确写法应该是:

int ch;
while ((ch = getchar()) != '\n')
{
    // 循环体
}

顺便提醒,`getchar()` 返回的是 `int`,用 `char` 保存可能会把 EOF 误判成普通字符,所以用 `int` 更安全。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-8-6 22:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表