小编dbu*_*ush的帖子

这个C函数应该总是返回false,但它不会

我很久以前在一个论坛里偶然发现了一个有趣的问题,我想知道答案.

考虑以下C函数:

在f1.c

#include <stdbool.h>

bool f1()
{
    int var1 = 1000;
    int var2 = 2000;
    int var3 = var1 + var2;
    return (var3 == 0) ? true : false;
}
Run Code Online (Sandbox Code Playgroud)

这应该总是返回falsevar3 == 3000.该main函数如下所示:

main.c中

#include <stdio.h>
#include <stdbool.h>

int main()
{
    printf( f1() == true ? "true\n" : "false\n");
    if( f1() )
    {
        printf("executed\n");
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

由于f1()应该总是返回false,人们会期望程序只能在屏幕上打印一个false.但是在编译并运行它之后,还会显示执行:

$ gcc main.c f1.c -o test …
Run Code Online (Sandbox Code Playgroud)

c gcc

311
推荐指数
4
解决办法
2万
查看次数

C++中的dynamic_cast和static_cast

dynamic_cast对C++中的关键字很困惑.

struct A {
    virtual void f() { }
};
struct B : public A { };
struct C { };

void f () {
    A a;
    B b;

    A* ap = &b;
    B* b1 = dynamic_cast<B*> (&a);  // NULL, because 'a' is not a 'B'
    B* b2 = dynamic_cast<B*> (ap);  // 'b'
    C* c = dynamic_cast<C*> (ap);   // NULL.

    A& ar = dynamic_cast<A&> (*ap); // Ok.
    B& br = dynamic_cast<B&> (*ap); // Ok.
    C& cr = dynamic_cast<C&> …
Run Code Online (Sandbox Code Playgroud)

c++ dynamic-cast

149
推荐指数
4
解决办法
16万
查看次数

64位Windows上的长位是多少?

不久前,有人告诉我long在64位机器上不是64位,我应该总是使用int.这对我来说没有意义.我已经看到docs(例如Apple官方网站上的文件)说long在编译64位CPU时确实是64位.我查了64位Windows上的内容并找到了

  • Windows:longint保持32位长度,并为64位整数定义特殊的新数据类型.

(来自http://www.intel.com/cd/ids/developer/asmo-na/eng/197664.htm?page=2)

我该怎么用?我应该定义类似uw,sw((UN)签署的宽度)为long如果没有在Windows,否则做对目标CPU bitsize支票?

c c++ windows 64-bit porting

134
推荐指数
5
解决办法
17万
查看次数

在C中,一个长的printf语句可以分成多行吗?

我有以下声明:

printf("name: %s\targs: %s\tvalue %d\tarraysize %d\n", sp->name, sp->args, sp->value, sp->arraysize);
Run Code Online (Sandbox Code Playgroud)

我想打破它.我尝试了以下但它不起作用.

printf("name: %s\t
args: %s\t
value %d\t
arraysize %d\n", 
sp->name, 
sp->args, 
sp->value, 
sp->arraysize);
Run Code Online (Sandbox Code Playgroud)

我怎么能分手呢?

c printf

79
推荐指数
4
解决办法
11万
查看次数

一个什么都不做的函数有什么实际用途吗?

运行时不执行任何操作的函数有什么用处,即:

void Nothing() {}
Run Code Online (Sandbox Code Playgroud)

请注意,我不是在谈论等待一定时间的函数,例如sleep(),只是需要编译器/解释器给出的时间。

c function

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

在POSIX系统上,argc可以为零吗?

鉴于主程序的标准定义:

int main(int argc, char *argv[]) {
   ...
}
Run Code Online (Sandbox Code Playgroud)

argcPOSIX系统在哪些情况下可以为零?

c posix program-entry-point language-lawyer

73
推荐指数
4
解决办法
4269
查看次数

我可以假设long int的大小总是4个字节吗?

总是这样long int(据我所知,这是一个同义词long)是4字节吗?

我可以依靠吗?如果没有,对于基于POSIX的操作系统是否属实?

c linux types posix

71
推荐指数
7
解决办法
2万
查看次数

C 中数组索引(相对于表达式)的求值顺序

看看这段代码:

static int global_var = 0;

int update_three(int val)
{
    global_var = val;
    return 3;
}

int main()
{
    int arr[5];
    arr[global_var] = update_three(2);
}

Run Code Online (Sandbox Code Playgroud)

哪个数组条目得到更新?0 还是 2?

C 的规范中是否有部分指示在这种特殊情况下操作的优先级?

c language-lawyer order-of-execution

47
推荐指数
2
解决办法
2646
查看次数

+ = uint16_t的运算符将指定的值提升为int并且不会编译

这对我来说是一个真正的WTF,看起来像GCC中的一个错误,但我想让社区看一看并为我找到解决方案.

这是我能想到的最简单的程序:

#include <stdio.h>
#include <stdint.h>

int main(void)
{
 uint16_t i = 1;
 uint16_t j = 2;
 i += j;
 return i;
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用-Werror=conversion标志在GCC上编译它,我正在使用我的大部分代码.

这是结果:

.code.tio.c: In function ‘main’:
.code.tio.c:9:7: error: conversion to ‘uint16_t {aka short unsigned int}’ from ‘int’ may alter its value [-Werror=conversion]
  i += j;
Run Code Online (Sandbox Code Playgroud)

此代码会发生同样的错误:

uint16_t i = 1;
i += ((uint16_t)3);
Run Code Online (Sandbox Code Playgroud)

错误是

.code.tio.c: In function ‘main’:
.code.tio.c:7:7: error: conversion to ‘uint16_t {aka short unsigned int}’ from ‘int’ may alter its value [-Werror=conversion]
  i …
Run Code Online (Sandbox Code Playgroud)

c gcc

45
推荐指数
3
解决办法
2956
查看次数

alloca() 在内存级别如何工作?

我试图弄清楚alloca()在记忆层面上实际上是如何工作的。来自Linux 手册页

alloca() 函数在调用者的堆栈帧中分配 size 字节的空间。当调用 alloca() 的函数返回到其调用者时,该临时空间会自动释放。

这是否意味着将按字节alloca()转发堆栈指针n?或者说新创建的内存到底分配在哪里?

这不是与可变长度数组完全相同吗?

我知道实现细节可能留给操作系统之类的东西。但我想知道一般来说这是如何实现的。

c alloca stack-frame variable-length-array

45
推荐指数
3
解决办法
4193
查看次数