C和C++中未定义,未指定和实现定义的行为有什么区别?
c c++ undefined-behavior unspecified-behavior implementation-defined-behavior
有没有办法告诉gcc,如果两个后续调用具有相同的参数,则只应调用一次具有副作用的函数.我想要以下行为:
foo(6);//run this function
foo(6);//optimize this away
foo(6);//optimize this away
foo(5);//run this function
foo(6);//run this function again
Run Code Online (Sandbox Code Playgroud)
我可以foo在做任何工作之前检查一个全局变量,但这不是最佳的.
void inline foo(int i){
static int last_i=i+1;
if(last_i != i){
last_i==i;
//do_work...
}
}
Run Code Online (Sandbox Code Playgroud)
由于foo是内联函数,编译器应该能够查看调用,foo()并看到它不必执行它.问题是编译器不能像全局变量那样优化,有没有办法让编译器知道这样做是否安全?
当我偶然发现这种"怪异"的行为时,我试图在另一个函数中调试我的代码.
#include <stdio.h>
#define MAX 20
int main(void) {
int matrix[MAX][MAX] = {{0}};
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果我在该return 0;行上设置断点并使用Code :: Blocks查看局部变量,则矩阵不会完全用零填充.第一行是,但数组的其余部分只包含随机垃圾.
我知道我可以做一个双for循环来手动将所有内容初始化为零,但不是C标准应该用{{0}}初始化程序将此矩阵填充为零?
也许是因为这是漫长的一天,我很累,但我可以发誓,我知道这一点.
我试着用不同的标准(与代码::块捆绑编译gcc编译): ,,-std=c89 但它是相同的.-std=c99std=c11
有什么不妥的想法?你能解释一下吗?
编辑:我特别询问{{0}}初始化程序.
我一直认为它会将所有列和所有行填充为零.
编辑2:我特别困扰Code::Blocks和捆绑GCC.其他评论说该代码适用于不同的平台.但为什么它对我不起作用?:/
谢谢.
鉴于以下声明:
char inputBuffer[12];
数组中任何一个char的默认值是多少?我很想知道这一点,因为如果我想在数组中清除一个位置,我需要知道给它的价值.
可能重复:
C中静态变量的初始化
我知道全局变量或静态在C中自动初始化为零.但是,我不确定是否只有一个或者只有一个被初始化.请注意,我不是在讨论函数中定义的变量,而是在.c文件中全局讨论变量.
那么以下哪个变量会自动初始化为零?
static struct mystruct var1;
struct mystruct var2;
static struct { int x; int y; } var3;
Run Code Online (Sandbox Code Playgroud) 管理联合的未初始化字节的规则是什么?(假设有些是初始化的)
下面是一个32字节的并集,我通过第一个成员初始化前16个字节.似乎剩余的字节是零初始化的.这对我的用例很有用,但我想知道这背后的规则是什么 - 我在期待垃圾.
#include <cstdint>
#include <iostream>
using namespace std;
union Blah {
struct {
int64_t a;
int64_t b;
};
int64_t c[4];
}
int main()
{
Blah b = {{ 1, 2 }}; // initialize first member, so only the first 16 bytes.
// prints 1, 2, 0, 0 -- not 1, 2, <garbage>, <garbage>
cout << b.c[0] << ", " << b.c[1] << ", " << b.c[2] << ", " << b.c[3] << '\n';
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我已经编译了GCC …
c ×5
c++ ×3
gcc ×2
arrays ×1
c89 ×1
c99 ×1
char ×1
codeblocks ×1
implementation-defined-behavior ×1
unions ×1