请考虑以下代码:
--alter existing column to int
ALTER TABLE [dbo].[APPLICATION] ALTER COLUMN [NEW_B] INT NULL
GO
--add foreign key constraint
ALTER TABLE [dbo].[APPLICATION] WITH CHECK ADD CONSTRAINT [FK_APPLICATION_ATTACHMENT] FOREIGN KEY([NEW_B])
REFERENCES [dbo].[ATTACHMENT] ([ID])
GO
ALTER TABLE [dbo].[APPLICATION] CHECK CONSTRAINT [FK_APPLICATION_ATTACHMENT]
GO
我的编译器(Visual Studio 2012)在这种情况下打印:if( ! is_int($value) || $value > 4){
// Validation failed here
}
int
那么我们能以某种方式推断出输出并且这段代码合法吗?
答案 0 :(得分:8)
您正在访问超出范围的内存(分配给单个int
对象)。行为是 undefined ,即不可推导。尽管在语法上有效,但该程序不应被视为合法。
答案 1 :(得分:4)
那么我们可以以某种方式推断出输出并且这段代码合法吗?
指针以它们指向的类型的大小的倍数递增。当您向p
添加4时,您将添加4 * sizeof(int)
,而不仅仅是4个字节。
如果你试图使p
指向“下一个”整数,则将其递增1而不是4.否则,p
将指向超出所分配结束的内存。
事实上,如果我没有弄错,您的分配只会创建一个值为3的int
,而不是三个单独的int
:
int* p = new int(3);
尝试评论p += 4;
行,你应该得到'3'作为输出。考虑到这一点,juanchopanza上面的回答是现场。