考虑这段代码:
#include <stdio.h>
static int g=3;
static int foo(int a)
{
return g+a;
}
int main(void)
{
printf("%i\n",foo(g++));
}
Run Code Online (Sandbox Code Playgroud)
输出总是7(假设printf()
不会失败)?意思是,标准是否保证g++
参数列表中的表达式在输入foo()
之前执行?foo()
或者编译器是否有可能在执行完成后设置g=3
调用foo()
并g==3
递增(并输出而不是输出)?g
foo()
6
7
我测试打印的所有编译器(版本)都7
没有显示任何警告。但这并不意味着事情必须如此。
我知道C标准允许在哪里实现
(sizeof(unsigned) > sizeof(size_t))
Run Code Online (Sandbox Code Playgroud)
要么
(sizeof(int) > sizeof(ptrdiff_t))
Run Code Online (Sandbox Code Playgroud)
是真的.但是有没有真正的实现,其中一个是真的?
背景
我编写了一个类似于asprintf()
(因为asprintf()
不可移植)的函数,并snprintf()
返回一个int
但需要一个size_t
参数,所以我应该检查leni
(如下所示)是否不小SIZE_MAX
于此代码?
va_copy(atmp,args)
int leni = vsnprintf(NULL,0,format,atmp); //get the size of the new string
va_end(atmp);
if(leni<0)
//do some error handling
if(leni>=SIZE_MAX) //do i need this part?
//error handling
size_t lens = ((size_t)leni)+1;
char *newString = malloc(lens);
if(!newString)
//do some error hanling
vsnprintf(newString,lens,format,args)!=lens-1)
Run Code Online (Sandbox Code Playgroud) 我知道编译器可能会在结构中添加一些填充字节.但是,当编译器发现我们从未从结构中的变量中读取时,结构的大小会比成员的总大小小吗?
struct Foo_T
{
int a;
intmax_t b;
};
void bar(void)
{
struct Foo_T foo;
foo.a=rand();
someFunction(foo.a);
//i never access foo.b, only foo.a
if(sizeof(foo)< sizeof(int)+sizeof(intmax_t))
{
//is it possible that we can end here?
}
}
Run Code Online (Sandbox Code Playgroud) 为什么科学记数法中的数字总是被读作a float
,如何将像'1e400'这样的字符串转换为a int
(对于a来说太大了float
)?
>>>int('1e400')
ValueError: invalid literal for int() with base 10: '1e400'
>>>int(float('1e400'))
OverflowError: cannot convert float infinity to integer
Run Code Online (Sandbox Code Playgroud)
我知道,我可以做一个像这样的功能:
def strtoint(string):
parts = string.split('e')
if len(parts) == 1:
return int(string)
elif len(parts) == 2:
if int(parts[1])<0:
return int(string)
return int(parts[0])*10**int(parts[1])
else:
return int(string) #raise a error if the string is invalid, but if the variable string is not a string, it may have other way to convert to an `int`
Run Code Online (Sandbox Code Playgroud)
但这不是一种非常pythonic的方式,有更好的方法吗?
这段代码会导致未定义的行为吗?因为缓冲区只有 128 字节长,但我告诉snprintf()
它更长。但是,生成的字符串短于 128 字节。
#include <stdio.h>
int main(void)
{
char buffer[128];
snprintf(buffer,294201,"%s","ABC");
puts(buffer);
return 0;
}
Run Code Online (Sandbox Code Playgroud) 是一个uintmax_t
保证大是否需要持有一个函数指针?
我知道这个:
以下类型指定无符号整数类型,能够表示任何无符号整数类型的任何值:
Run Code Online (Sandbox Code Playgroud)uintmax_t
和
下面的类型指定一个无符号整数类型,其属性是任何有效的void指针都可以转换为此类型,然后转换回指向void的指针,结果将比较原始指针:uintptr_t
并且一个void-Pointer可能不大,只能保存一个函数指针,因此uintptr_t也可能不足以容纳一个函数指针.
当您有符合 IEEE754 标准的浮点实现时,与NaN
is false
、 Even NaN == NaN
、 but +inf == +inf
is进行任何比较true
,为什么?
从我的角度来看,说是假的更有意义 +inf == +inf
,原因是:
自然数和实数的个数都是无限的,但并不相同。
如果有X=1e200
and Y=1e300
(X 和 Y 都是 64 位双精度数),那么x==y
也是false
, butx*1e200==y*1e200
是 true true
(都是 +inf),这是数学上不正确的。
已经需要进行特殊处理, for NaN
, where X==X
is ,因此实现该returnfalse
不会有更多的实现复杂性。也许甚至更少,因为和我们同一个“指数”。+inf == +inf
false
inf
NaN
我没有看到任何优势,也没有看到任何需要这样的应用程序+inf == +inf
。无论如何,您不应该比较任何浮点值==
。
X==Y
那么一般的话true
,如果X-Y==0
是true
,但是inf-inf
是NaN …
在C中,在使用IEEE-754浮点数的实现中,当我比较两个NaN的浮点数时,它返回0或"false".但是为什么两个浮点数都被认为是相等的呢?
这个程序打印"相等:......"(至少在Linux AMD64下使用gcc),在我看来它应该打印"不同:......".
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
volatile double a = 1e200; //use volatile to suppress compiler warnings
volatile double b = 3e200;
volatile double c = 1e200;
double resA = a * c; //resA and resB should by inf
double resB = b * c;
if (resA == resB)
{
printf("equal: %e * %e = %e = %e = %e * %e\n",a,c,resA,resB,b,c);
}
else
{
printf("different: %e * %e = %e != %e = %e * …
Run Code Online (Sandbox Code Playgroud) 例如我有这 3 个函数和函数指针:
char *(*f)(char, int);
char *(*g(char, int));
char **h(char, int);
Run Code Online (Sandbox Code Playgroud)
如果我们将它们翻译成英文,我们会得到:
将 f 声明为指向函数 (char, int) 的指针,返回指向 char 的指针
将 g 声明为函数 (char, int) 返回指向 char 的指针
将 h 声明为函数 (char, int) 返回指向 char 的指针
类型 2. 和类型 3. 是相等的。我们可以检查一下吗,也许是这样的:
if(g==h)
{
do something;
}
Run Code Online (Sandbox Code Playgroud)
在c中?
c 也允许类似的东西吗g=h
?(如果是,它实际上是做什么的?)