我很久以前在一个论坛里偶然发现了一个有趣的问题,我想知道答案.
考虑以下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)
这应该总是返回false自var3 == 3000.该main函数如下所示:
#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) 我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) 不久前,有人告诉我long在64位机器上不是64位,我应该总是使用int.这对我来说没有意义.我已经看到docs(例如Apple官方网站上的文件)说long在编译64位CPU时确实是64位.我查了64位Windows上的内容并找到了
- Windows:
long并int保持32位长度,并为64位整数定义特殊的新数据类型.
(来自http://www.intel.com/cd/ids/developer/asmo-na/eng/197664.htm?page=2)
我该怎么用?我应该定义类似uw,sw((UN)签署的宽度)为long如果没有在Windows,否则做对目标CPU bitsize支票?
我有以下声明:
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)
我怎么能分手呢?
运行时不执行任何操作的函数有什么用处,即:
void Nothing() {}
Run Code Online (Sandbox Code Playgroud)
请注意,我不是在谈论等待一定时间的函数,例如sleep(),只是需要编译器/解释器给出的时间。
鉴于主程序的标准定义:
int main(int argc, char *argv[]) {
...
}
Run Code Online (Sandbox Code Playgroud)
argcPOSIX系统在哪些情况下可以为零?
总是这样long int(据我所知,这是一个同义词long)是4字节吗?
我可以依靠吗?如果没有,对于基于POSIX的操作系统是否属实?
看看这段代码:
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 的规范中是否有部分指示在这种特殊情况下操作的优先级?
这对我来说是一个真正的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) 我试图弄清楚alloca()在记忆层面上实际上是如何工作的。来自Linux 手册页:
alloca() 函数在调用者的堆栈帧中分配 size 字节的空间。当调用 alloca() 的函数返回到其调用者时,该临时空间会自动释放。
这是否意味着将按字节alloca()转发堆栈指针n?或者说新创建的内存到底分配在哪里?
这不是与可变长度数组完全相同吗?
我知道实现细节可能留给操作系统之类的东西。但我想知道一般来说这是如何实现的。