标签: c99

使用 printf 将 int 转换为 char

我只是想知道以下是否是将 int 转换为 char 的正确方法

#include <stdio.h>

int main()
{
   int x = 500;
   printf("%hhd\n", x);
}
Run Code Online (Sandbox Code Playgroud)

另外,从上面我想知道是否应该执行以下操作来显示字符的值。

#include <stdio.h>

int main()
{
   char c = 'a';
   printf("%hhd\n", c);
}
Run Code Online (Sandbox Code Playgroud)

还是会printf("%d\n", c);没事的?所以,基本上我试图通过 printf 输出整数的第一个字节而不进行任何转换。

c printf c99

0
推荐指数
1
解决办法
1万
查看次数

如果我将空字符串传递给 C 中的 put() 会发生什么?

C99 标准是否定义了以下行为:

puts(s);// s != NULL but *s==""

我在 Linux 手册页中查找过这一点,但没有发现任何有用的东西。有人可以澄清一下吗?

c99

0
推荐指数
1
解决办法
457
查看次数

C99 中指向数组开始之前的元素

我有一个整数数组:

int* counters = (int *) calloc(N, sizeof(int));
Run Code Online (Sandbox Code Playgroud)

必须使用基于一个的索引进行索引,例如第一个元素的索引为 1,第二个元素的索引为 2,等等。由于性能非常重要,我决定使用一个技巧:

int* oneIndexedCounters = counters - 1;
Run Code Online (Sandbox Code Playgroud)

这允许我使用基于 1 的索引,而无需从索引中减去 1:

// A[i] - contains one based indexes
for (int i = 0; i < K; i++) {
    oneIndexedCounters[A[i]] += B[i]; // many times in code
    // some other operations on oneIndexedCounters
}
Run Code Online (Sandbox Code Playgroud)

插入:

for (int i = 0; i < K; i++) {
    counters[A[i]-1] += B[i];
    // ...
}
Run Code Online (Sandbox Code Playgroud)

counters数组是由我的函数返回的,因此我无法在数组开头分配虚拟元素。

当您不取消引用该指针时,指向数组之前的一个元素是否有效(例如,当数组位于内存页边界上时)?或者是否有其他解决方案不那么棘手并且具有良好的性能?

c arrays pointers c99

0
推荐指数
1
解决办法
267
查看次数

使用函数参数作为变量

在函数内部重新分配函数参数是不好还是好的做法,或者可能是未定义的行为?

让我用一个例子解释一下我想要做什么,这里是函数:

void
gkUpdateTransforms(GkNode *node /* other params */) {
  GkNode *nodei;

  if (!(nodei = node->chld))
    return;

  do {
    /* do job */
    nodei = nodei->next;
  } while (nodei);
}
Run Code Online (Sandbox Code Playgroud)

选择:

void
gkUpdateTransforms2(GkNode *node /* other params */) {

  /* node parameter is only used here to get chld, not anywhere else */
  if (!(node = node->chld))
    return;

  do {
    /* do job */
    node = node->next;
  } while (node);
}
Run Code Online (Sandbox Code Playgroud)

我检查了程序集输出,看起来是一样的,我们不需要在第二个输出中声明变量。您可能会问,如果参数类型发生变化,但第一个条件相同怎么办,因为它也需要更新。

编辑:参数是按值传递的,我的目的不是编辑指针本身

EDIT2:递归函数怎么样?如果 gkUpdateTransforms2 是递归的,会发生什么?我很困惑,因为函数会调用自身,但我认为在每次调用中,参数都会有不同的堆栈

c function c99 c89 function-parameter

0
推荐指数
1
解决办法
100
查看次数

具有已定义宽度的整数类型

在Nuttshell中读到C遇到了一个 具有精确宽度的整数类型(C99) 在此输入图像描述

有人可以解释一下这种数据类型的用途

我在哪里可以在代码中使用这些数据类型

为什么要引入这些数据类型

我是C编程的初学者

c types integer c99

0
推荐指数
1
解决办法
199
查看次数

函数“池”的隐式声明在 C99 中无效

该程序的目标是将大量整数存储在一个数组中,如下所示。它使用“池”函数来收集索引为 2 的整数,并将“池”返回给主函数。我尝试在 Xcode 11 中编译代码,但是在 main 中调用“pool”函数期间出现了这个错误“函数‘池’的隐式声明在 C99 中无效”。我该如何解决?如何将 Xcode 上的编译器更改为 C11 标准?

#include <stdio.h>
#include <stdlib.h>
#define SIZE 1000000000

int group[SIZE];

int main()
{
    pool();
    return 0;
}

int pool()
{
    for (int index = 2; index < SIZE; index++)
    {
        group[index] = 1;
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c xcode c99 c11

0
推荐指数
1
解决办法
3920
查看次数

如何在C中读取文本行

我需要从文本文件中获取行.我已经知道线条不会超过70个字符.
我知道如何做到这一点,但我正在寻找一个标准的解决方案.

c c99

-1
推荐指数
1
解决办法
1026
查看次数

C中的积分提升和平衡有什么区别?

积分提升和平衡有什么区别。我们可以通过说在执行任何操作之前将任何类型转换为至少 int 或 unsigned int 类型(逻辑运算符 &&、||、!比整数?

c c99 misra c89

-1
推荐指数
1
解决办法
1380
查看次数

为什么C99为复杂类型添加关键字?

我发现C99添加_Complex了支持复杂算术.但是,我想知道为什么C99为这样一个与字段相关的功能添加新关键字(仅对科学计算有用).通过标准库支持复杂类型不是更好吗?

c c99

-1
推荐指数
1
解决办法
149
查看次数

C 编译器如何处理内存方面的后自增 (i++)?

我刚刚i++++i朋友解释了细节。我告诉他如何在没有优化的情况下,循环本质i++上意味着制作一个不用于任何用途的for副本。i因为i++可以用这个伪代码来描述:

tmp = i;
i = i + 1;
return tmp;
Run Code Online (Sandbox Code Playgroud)

好吧,我注意到我真的不知道一件事:我们tmp分配的内存在哪里?它会增加整个过程/功能所需的内存大小吗?(也就是说,它在堆栈上吗?)

我想是的,但是如何测试呢?当且仅当重要时我们才讨论 C99 标准和 GCC 编译器。但我更喜欢更广泛的答案,以获得对此事的一些看法。

c gcc increment c99

-1
推荐指数
2
解决办法
2382
查看次数

标签 统计

c99 ×10

c ×9

c89 ×2

arrays ×1

c11 ×1

function ×1

function-parameter ×1

gcc ×1

increment ×1

integer ×1

misra ×1

pointers ×1

printf ×1

types ×1

xcode ×1