为了确定系统的字节顺序,我计划将多字节整数值存储在变量中,并通过;包装来访问第一个字节。例如:unsigned charunion
union{
unsigned int val;
unsigned char first_byte;
} test;
test.val = 1; /* stored in little-endian system as "0x01 0x00 0x00 0x00" */
if(test.first_byte == 1){
printf("Little-endian system!");
}else{
printf("Big-endian system!");
}
Run Code Online (Sandbox Code Playgroud)
我想让这个测试可以跨平台移植,但我不确定 C99 标准是否保证数据unsigned int类型的大小大于1 个字节。此外,由于“C 字节”在技术上不必是 8 位大小,因此我无法使用精确宽度的整数类型(例如uint8_t、uint16_t等)。
C99 标准是否保证 C 数据类型的大小至少为两个字节?
PS假设 anunsigned int实际上大于一个字节,我的union行为是否会在所有 C99 兼容平台上按照我的预期(变量first_byte访问variable 中的第一个字节val)?
有一个问题已经回答了变量声明的特殊情况,但是其他文字常量的使用呢?
例如:
uint64_t a;
...
int32_t b = a / 1000000000;
Run Code Online (Sandbox Code Playgroud)
在任何标准 C 编译器中,最后一段代码是否等同于下一段代码?
uint64_t a;
...
int32_t b = (int32_t)(a / UINT64_C(1000000000));
Run Code Online (Sandbox Code Playgroud)
换句话说,是否需要 xINTn_C 宏(假设我们在隐式错误的情况下使用显式转换)?
编辑
当编译器读取 时1000000000,是否允许将其存储为int内部表示(删除所有溢出位),或者它必须以尽可能高的精度(long long)存储它,直到它解析整个表达式类型?它是实现定义的行为还是标准规定的?
我想知道我当前在 Visual Studio C++ 中使用哪个 C 标准,但我在使用__STDC_VERSION__预定义宏和其他 C99 预定义宏时遇到了问题 - 出现一条错误,表明该标识符未定义,当我使用时,#ifndef __STDC_VERSION__似乎它没有定义。这是否意味着我正在使用 ANSI C?
下面是使用的示例代码__STDC_VERSION__:
int main(void) {
printf("%d\n", __STDC_VERSION__);
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我想用标志编译我的 C99 项目-fsanitize=address。我需要使用 CMake 并在 Centos 7 发行版上使用 gcc 进行编译。
我目前有gcc 7.3.1和cmake 3.13.4。
我-fsanitize=address在编译标志列表和链接器中添加了标志,但它仍然无法编译并出现以下错误:
[ 6%] Building C object CMakeFiles/last.dir/src/ast/ast.c.o
[ 13%] Building C object CMakeFiles/last.dir/src/ast/ast_printer.c.o
[ 20%] Building C object CMakeFiles/last.dir/src/ast/cleaner.c.o
[ 26%] Linking C static library liblast.a
[ 26%] Built target last
[ 33%] Building C object CMakeFiles/lexecution.dir/src/execution/exec_parser.c.o
[ 40%] Building C object CMakeFiles/lexecution.dir/src/execution/exec_utils.c.o
[ 46%] Building C object CMakeFiles/lexecution.dir/src/execution/exec_func.c.o
[ 53%] Building C object CMakeFiles/lexecution.dir/src/execution/exec_parser_options.c.o
[ 60%] Linking C …Run Code Online (Sandbox Code Playgroud) 这两者有区别吗?
typedef struct {
unsigned int day;
unsigned int month;
unsigned int year;
}birthday_t;
typedef struct {
const birthday_t birthday;
const unsigned int id;
}person_t;
person_t person = {
.birthday = {1,20,2000},
.id = 123};
Run Code Online (Sandbox Code Playgroud)
和
typedef struct {
unsigned int day;
unsigned int month;
unsigned int year;
}birthday_t;
typedef struct {
birthday_t birthday;
unsigned int id;
}person_t;
const person_t person = {
.birthday = {1,20,2000},
.id = 123};
Run Code Online (Sandbox Code Playgroud)
如果结构内的成员是 const 但结构不是常量(顶部),这与没有 const 成员的 const 结构(底部)有什么不同?
我熟悉 C++,最近决定学习 C。我所关注的教程经常写这样的 for 循环:
int i;
for (i = 0; i < 5; i++)
{
printf("%d", i);
}
Run Code Online (Sandbox Code Playgroud)
您可以看到计数器 (i) 是在 for 循环体之外声明的。在用 C(和 C++)编写时,我写:
for (int i = 0; i < 5; i++)
{
printf("%d", i);
}
Run Code Online (Sandbox Code Playgroud)
我对此进行了一些研究,似乎后者在 C89 中是非法的,并且仅在 C99 中引入。但是,我使用的教程是基于 C99 的,而且我还看到了很多现代 C 代码,其中计数器仍然在 for 循环体之外声明。
因此,我要问的问题是:在 C99 中在 for 循环体之外声明计数器有什么实际好处吗?换句话说,我应该怎么写?
注意:我已经看到有“类似的问题”,但他们中的大多数人都在问为什么在某些代码中在 for 循环体之外声明计数器,而不是是否有任何好处。话虽如此,有一个类似的问题正在询问好处,但它是在 C++ 中,我不确定这两种语言在这方面是否存在差异。
自从我开始用 C 编码以来,我就被教导说
for(int i=0;i<10;++i)
...
Run Code Online (Sandbox Code Playgroud)
在 C++ 中工作,但在 C 中,您必须在 for 循环之外声明变量,如下所示:
int i;
for(i=0;i<10;++i)
...
Run Code Online (Sandbox Code Playgroud)
我特别记得这是一个问题,因为当我开始用 C 编码时,我已经习惯了 C++ for 循环。
但是今天我正在阅读 2010 年 12 月的 C11 标准草案,它将 for 循环定义为
“for(子句1;表达式2;表达式3)语句”
在它的语法描述中,它指出:
“如果第 1 条是声明,则它声明的任何标识符的范围是声明的其余部分和整个循环”。
然后我做了一个测试并意识到我的 gcc(Debian 8.3.0)在 -std=c99 和 -std=c11 模式下以 C++ 风格编译 for 循环,即使使用 -Wall 标志也没有警告。
这是一个 gcc 扩展,还是 C 支持这种类型的循环有一段时间了,我只是没有注意到?
我有一个数组,我需要在数组中找到 n 个并列案例,例如{1,2,3,3}我需要程序返回两个 3
void print_winner(void)
{
// TODO
string arr[9];
string name = "";
int largest = 0;
for (int i = 0; i < voter_count; i++)
{
if (largest<candidates[i].votes)
{
largest = candidates[i].votes;
name = candidates[i].name;
}
}
// arr[0] = name;
printf("%s\n", name);
return;
}
Run Code Online (Sandbox Code Playgroud)
在这段代码中,候选人是一个具有两个属性的结构:名称和投票我需要该程序打印出票数最高的名称,即使有 3 路平局
我想我会遍历列表找到最大的 int 然后删除那个 int 并再次遍历列表以查看是否有任何元素等于原始列表中的最大元素,如果是,则将名称添加到数组中,最后打印所有名字)
是否可以安全地将具有类型的变量转换为C99 中的size_t类型int?
我很欣赏size_t未签名,但在我们需要int代表的情况下,我们能做什么?
对于sizeof运算符,我看到以下结果;我无法理解背后的原因。我的理解是sizeof运算符以size_t 的形式返回结果 下面是结果,
sizeof("6") -> 2
sizeof("a") -> 2
sizeof('a') -> 4
sizeof("something") -> 10
sizeof("some") -> 5
Run Code Online (Sandbox Code Playgroud)